本文处理的场景如下,hive表中的数据,对其中的多列进行判重deduplicate。

1、先解决依赖,spark相关的所有包,pom.xml

spark-hive是我们进行hive表spark处理的关键。

<dependencies>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.10</artifactId>
<version>1.6.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-hive_2.10</artifactId>
<version>1.6.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_2.10</artifactId>
<version>1.6.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.19</version>
</dependency>
</dependencies>

2、spark-client

package com.xiaoju.kangaroo.duplicate;

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.sql.SQLContext;
import org.apache.spark.sql.hive.HiveContext; import java.io.Serializable; public class SparkClient implements Serializable{
private SparkConf sparkConf;
private JavaSparkContext javaSparkContext; public SparkClient() {
initSparkConf();
javaSparkContext = new JavaSparkContext(sparkConf);
} public SQLContext getSQLContext() {
return new SQLContext(javaSparkContext);
} public HiveContext getHiveContext() {
return new HiveContext(javaSparkContext);
} private void initSparkConf() {
try {
String warehouseLocation = System.getProperty("user.dir");
sparkConf = new SparkConf()
.setAppName("duplicate")
.set("spark.sql.warehouse.dir", warehouseLocation)
.setMaster("yarn-client");
} catch (Exception ex) {
ex.printStackTrace();
}
} }

3、判重流程

package com.xiaoju.kangaroo.duplicate;

import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.function.FlatMapFunction;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.api.java.function.Function2;
import org.apache.spark.api.java.function.PairFunction;
import org.apache.spark.sql.DataFrame;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.hive.HiveContext;
import scala.Tuple2; import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; public class SparkDuplicate implements Serializable { private transient SparkClient sparkClient;
private transient HiveContext hiveContext;
private String db;
private String tb;
private String pt;
private String cols; public SparkDuplicate(String db, String tb, String pt, String cols) {
this.db = db;
this.tb = tb;
this.pt = pt;
this.cols = cols;
this.sparkClient = new SparkClient();
this.hiveContext = sparkClient.getHiveContext();
} public void duplicate() {
String partition = formatPartition(pt);
String query = String.format("select * from %s.%s where %s", db ,tb, partition);
System.out.println(query);
DataFrame rows = hiveContext.sql(query);
JavaRDD<Row> rdd = rows.toJavaRDD();
Map<String, Integer> repeatRetMap = rdd.flatMap(new FlatMapFunction<Row, String>() {
public Iterable<String> call(Row row) throws Exception {
HashMap<String, Object> rowMap = formatRowMap(row);
List<String> sList = new ArrayList<String>();
String[] colList = cols.split(",");
for (String col : colList) {
sList.add(col + "@" + rowMap.get(col));
}
return sList;
}
}).mapToPair(new PairFunction<String, String, Integer>() {
public Tuple2<String, Integer> call(String s) throws Exception {
return new Tuple2<String, Integer>(s, 1); }
}).reduceByKey(new Function2<Integer, Integer, Integer>() {
public Integer call(Integer integer, Integer integer2) throws Exception {
return integer + integer2;
}
}).map(new Function<Tuple2<String,Integer>, Map<String, Integer>>() {
public Map<String, Integer> call(Tuple2<String, Integer> stringIntegerTuple2) throws Exception {
Map<String, Integer> retMap = new HashMap<String, Integer>();
if (stringIntegerTuple2._2 > 1) {
retMap.put(stringIntegerTuple2._1, stringIntegerTuple2._2);
}
return retMap;
}
}).reduce(new Function2<Map<String, Integer>, Map<String, Integer>, Map<String, Integer>>() {
public Map<String, Integer> call(Map<String, Integer> stringIntegerMap, Map<String, Integer> stringIntegerMap2) throws Exception {
stringIntegerMap.putAll(stringIntegerMap2);
return stringIntegerMap;
}
}); for (Map.Entry<String, Integer> entry : repeatRetMap.entrySet()) {
if (entry.getValue() > 1) {
System.out.println("重复值为:" + entry.getKey() + ", 重复个数" + entry.getValue());
}
}
} private String formatPartition(String partition) {
String format = "";
if (partition.startsWith("pt") || partition.startsWith("dt")) {
String[] items = partition.split("=");
for (int i = 0; i < items.length; i++) {
if (items[i].equals("pt") || items[i].equals("dt")) {
format += items[i];
} else {
format += "='" + items[i] + "'";
}
}
} else {
String[] keys;
if (partition.contains("w=")){
keys = new String[] {"year", "week"};
partition = partition.replace("w=", "");
}
else{
keys = new String[] {"year","month","day", "hour"};
}
String[] items = partition.split("/");
for(int i=0; i<items.length; i++) {
if (i == items.length-1) {
format += keys[i] + "='" + items[i] + "'";
} else {
format += keys[i] + "='" + items[i] + "' and ";
}
}
}
return format;
} private HashMap<String, Object> formatRowMap(Row row){
HashMap<String, Object> rowMap = new HashMap<String, Object>();
try {
for (int i=0; i<row.schema().fields().length; i++) {
String colName = row.schema().fields()[i].name();
Object colValue = row.get(i);
rowMap.put(colName, colValue); }
}catch (Exception ex) {
ex.printStackTrace();
}
return rowMap;
} public static void main(String[] args) {
String db = args[0];
String tb = args[1];
String pt = args[2];
String cols = args[3];
SparkDuplicate sparkDuplicate = new SparkDuplicate(db, tb, pt, cols);
sparkDuplicate.duplicate();
}
}

4、运行方式

提交任务脚本

#!/bin/bash
source /etc/profile
source ~/.bash_profile
db=$
table=$
partition=$
cols=$
spark-submit \
--queue=root.zhiliangbu_prod_datamonitor \
--driver-memory 500M \
--executor-memory 13G \
--num-executors \
spark-duplicate-1.0-SNAPSHOT-jar-with-dependencies.jar ${db} ${table} ${partition} ${cols}

运行:

sh run.sh gulfstream_ods g_order // area,type

结果

重复值为:area@, 重复个数225
重复值为:area@, 重复个数7398
重复值为:area@, 重复个数69823
重复值为:area@, 重复个数98317
重复值为:area@, 重复个数91775
重复值为:area@, 重复个数72053
重复值为:area@, 重复个数2362
重复值为:area@, 重复个数264487
重复值为:area@, 重复个数2927
重复值为:area@, 重复个数230484
重复值为:area@, 重复个数87527
重复值为:area@, 重复个数74987
重复值为:area@, 重复个数130297
重复值为:area@, 重复个数24463
重复值为:area@, 重复个数15699
重复值为:area@, 重复个数13517
重复值为:area@, 重复个数4774
重复值为:area@, 重复个数5022
重复值为:area@, 重复个数6737
重复值为:area@, 重复个数12705
重复值为:area@, 重复个数18961
重复值为:area@, 重复个数20715
重复值为:area@, 重复个数15179
重复值为:area@, 重复个数1276
重复值为:area@, 重复个数31664
重复值为:area@, 重复个数61261
重复值为:area@, 重复个数32496
重复值为:area@, 重复个数55877
重复值为:area@, 重复个数40933
重复值为:area@, 重复个数32564
重复值为:area@, 重复个数300
重复值为:area@, 重复个数21405
重复值为:area@, 重复个数37696
重复值为:area@, 重复个数212
重复值为:area@, 重复个数12442
重复值为:area@, 重复个数2526
重复值为:area@, 重复个数17456
重复值为:area@, 重复个数12688
重复值为:area@, 重复个数17285
重复值为:area@, 重复个数11511
重复值为:area@, 重复个数6622
重复值为:area@, 重复个数9573
重复值为:area@, 重复个数2416
重复值为:area@, 重复个数8109
重复值为:area@, 重复个数27915
重复值为:area@, 重复个数58942
重复值为:area@, 重复个数18842
重复值为:area@, 重复个数3482
重复值为:area@, 重复个数31452
重复值为:area@, 重复个数11436
重复值为:area@, 重复个数656
重复值为:area@, 重复个数31557
重复值为:area@, 重复个数1726
重复值为:type@, 重复个数288479
重复值为:type@, 重复个数21067365

使用spark对hive表中的多列数据判重的更多相关文章

  1. 使用spark将内存中的数据写入到hive表中

    使用spark将内存中的数据写入到hive表中 hive-site.xml <?xml version="1.0" encoding="UTF-8" st ...

  2. 将DataFrame数据如何写入到Hive表中

    1.将DataFrame数据如何写入到Hive表中?2.通过那个API实现创建spark临时表?3.如何将DataFrame数据写入hive指定数据表的分区中? 从spark1.2 到spark1.3 ...

  3. Spark 读写hive 表

    spark 读写hive表主要是通过sparkssSession 读表的时候,很简单,直接像写sql一样sparkSession.sql("select * from xx") 就 ...

  4. [Spark][Hive][Python][SQL]Spark 读取Hive表的小例子

    [Spark][Hive][Python][SQL]Spark 读取Hive表的小例子$ cat customers.txt 1 Ali us 2 Bsb ca 3 Carls mx $ hive h ...

  5. Hive表中Partition的创建

    作用: 在Hive Select查询中一般会扫描整个表内容,会消耗很多时间做没必要的工作.有时候只需要扫描表中关心的一部分数据,在对应的partition里面去查找就可以,减少查询时间. 1. 创建表 ...

  6. sqoop导入数据到hive表中的相关操作

    1.使用sqoop创建表并且指定对应的hive表中的字段的数据类型,同时指定该表的分区字段名称 sqoop create-hive-table --connect "jdbc:oracle: ...

  7. 如何将hive表中的数据导出

    近期经常将现场的数据带回公司测试,所以写下该文章,梳理一下思路. 1.首先要查询相应的hive表,比如我要将c_cons这张表导出,我先查出hive中是否有这张表. 查出数据,证明该表在hive中存在 ...

  8. 20.采集项目流程篇之清洗数据绑定到hive表中

    先启动hive 在mydb2这个数据库中创建表: create external table mydb2.access(ip string,day string,url string,upflow s ...

  9. 11.把文本文件的数据导入到Hive表中

    先在hive里面创建一个表 create table mydb2.t3(id int,name string,age int) row format delimited fields terminat ...

随机推荐

  1. CCIE-MPLS VPN-实验手册(中卷)

    5:MPLS VPN PE CE OSPF 实验1 5.1 实验拓扑 5.2 实验需求 a. R1 R2 R3 组成P-NETWORK,底层协议采用EIGRP b. R1 R2 R3 直连链路启用LD ...

  2. 非对话框程序创建组合框Groupbox

    对话框程序中的控件,例如button.groupbox之类,是直接放上去的.当然,除groupbox以外,在MFC中其他控件都有相对应的类,以支持程序员在非对话框程序中动态创建控件.而唯独好像没有gr ...

  3. Ubuntu 14.02 cmake升级 失败解决

    错误的提示: CMake Error: Could not find CMAKE_ROOT !!! CMake has most likely not been installed correctly ...

  4. 软工+C(2017第3期) 超链接

    // 上一篇:分数和checklist // 下一篇:Alpha/Beta换人 注:平常看文章,总有能和构建之法,软件工程相关的链接,增量记录,也可以通过在其他人博客的交流中使用相关的超链接,在使用中 ...

  5. 201521044091 《Java程序设计》第13周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容.

  6. windows 2008 R2操作系统上使用iis服务运行php和mysql数据库的网站遇到的验证码不显示问题?

    1,本地运行正常,路径没问题. 2,GD2.dll开启 3,IIS服务正常开启,并启用父路径为True 4,检查是否IIS服务中FSO权限问题 开始 -> 程序 -> 管理工具 -> ...

  7. python 集合的操作

    list_1 = set([1,2,3,4,5])#print(list_1,type(list_1))list_2 = set([1,2,3,6,7,8,9,10])#print(list_2,ty ...

  8. bat文件逐行读取txt

    From_Ip='192.138.60.16'@echo offfor /f "tokens=1,2 delims='" %%a in (D:\ETL\bat\config.txt ...

  9. Day-1:初识开发板与基础知识

    买的这款51,ARM,AVR三合一的单片机,也不知道后面具体使用会不会有问题,先玩玩看吧. ------------------------------------------------------ ...

  10. 深入理解计算机系统chapter8

    进程轮流使用处理器 父进程调用fork来创建一个新的子进程 回收子进程 waitpid/wait 非本地跳转: