编写独立应用程序实现数据去重
对于两个输入文件 A 和 B,编写 Spark 独立应用程序,对两个文件进行合并,并剔除其
中重复的内容,得到一个新文件 C。下面是输入文件和输出文件的一个样例,供参考。
输入文件 A 的样例如下:
20170101 x
20170102 y
20170103 x
20170104 y
20170105 z
20170106 z
输入文件 B 的样例如下:
20170101 y
20170102 y
20170103 x
20170104 z
20170105 y
根据输入的文件 A 和 B 合并得到的输出文件 C 的样例如下:
20170101 x
20170101 y
20170102 y
20170103 x
20170104 y
20170104 z
20170105 y
20170105 z
20170106 z
package my.scala
import org.apache.spark.{SparkConf, SparkContext}
object
case2 {
def main(args: Array[String]): Unit = {
val conf =
new
SparkConf().setMaster(
"local"
).setAppName(
"reduce"
)
val sc =
new
SparkContext(conf)
sc.setLogLevel(
"ERROR"
)
//获取数据
val two = sc.textFile(
"hdfs://192.168.85.128:9000/quchong"
)
two.filter(_.trim().length>0)
//需要有空格。
.map(line=>(line.trim,
""
))
//全部值当key,(key value,"")
.groupByKey()
//groupByKey,过滤重复的key value ,发送到总机器上汇总
.sortByKey()
//按key value的自然顺序排序
.keys.collect().
foreach
(println)
//所有的keys变成数组再输出
//第二种有风险
two.filter(_.trim().length>0)
.map(line=>(line.trim,
"1"
))
.distinct()
.reduceByKey(_+_)
.sortByKey()
.
foreach
(println)
//reduceByKey,在本机suffle后,再发送一个总map,发送到一个总机器上汇总,(汇总要压力小)
//groupByKey,发送本机所有的map,在一个机器上汇总(汇总压力大)
//如果数据在不同的机器上,则会出现先重复数据,distinct,reduceBykey,只是在本机上去重,谨慎一点的话,在reduceByKey后面需要加多一个distinct
}
}