scala flatmap、reduceByKey、groupByKey

时间:2023-03-09 05:33:33
scala flatmap、reduceByKey、groupByKey

1、test.txt文件中存放

asd sd fd gf g
dkf dfd dfml dlf
dff gfl pkdfp dlofkp
// 创建一个Scala版本的Spark Context
val conf = new SparkConf().setAppName("wordCount")
val sc = new SparkContext(conf)
// 读取我们的输入数据
val input = sc.textFile(inputFile)
// 把它切分成一个个单词
val words = input.flatMap(line => line.split(" "))

//words为------------------

asd

sd

fd

gf

g

dkf

dfd

dfml

dlf

dff

gfl

pkdfp

dlofkp

scala flatmap、reduceByKey、groupByKey

val counts = words.map(word => (word, 1)).reduceByKey{case (x, y) => x + y}
// 将统计出来的单词总数存入一个文本文件,引发求值
counts.saveAsTextFile(outputFile)

//reduceByKey  合并key计算

scala flatmap、reduceByKey、groupByKey

2、reduceByKey  合并key计算

按key求和
val rdd = sc.parallelize(List((“a”,2),(“b”,3),(“a”,3))) 合并key计算
val r1 = rdd.reduceByKey((x,y) => x + y) 输出结果如下 (a,5)
(b,3)

reduceByKey:reduceByKey会在结果发送至reducer之前会对每个mapper在本地进行merge,有点类似于在MapReduce中的combiner。

这样做的好处在于,在map端进行一次reduce之后,数据量会大幅度减小,从而减小传输,保证reduce端能够更快的进行结果计算。

scala flatmap、reduceByKey、groupByKey

groupByKey:groupByKey会对每一个RDD中的value值进行聚合形成一个序列(Iterator),

此操作发生在reduce端,所以势必会将所有的数据通过网络进行传输,造成不必要的浪费。

同时如果数据量十分大,可能还会造成OutOfMemoryError。

scala flatmap、reduceByKey、groupByKey

通过以上对比可以发现在进行大量数据的reduce操作时候建议使用reduceByKey。

不仅可以提高速度,还是可以防止使用groupByKey造成的内存溢出问题。

scala flatmap、reduceByKey、groupByKey

scala flatmap、reduceByKey、groupByKey

scala flatmap、reduceByKey、groupByKey

scala flatmap、reduceByKey、groupByKey