DataFrame pyspark 只有groupByKey,容易在shuff中爆掉,改用RDD的reduceByKey、aggregateByKey相关算子
对类似实现sql的group by的相关算子进行区别分析
一:DataFrame.groupBy() 操作不会在partition中自己合并计算,会整个分组后进行shullf,
如下一个partition数据
groupBy()前:
key | value |
---|---|
a | 1 |
b | 4 |
a | 2 |
c | 5 |
a | 3 |
groupBy()后
key | value |
---|---|
a | 1 |
a | 2 |
a | 3 |
key | value |
---|---|
b | 4 |
key | value |
---|---|
c | 5 |
一起进行shuff网络传输,针对亿级数据,百万个key,或者key对应值有百万个太耗内存,所以官网推荐使用rdd的reduce/reduceByKey操作
二:reduceByKey实现groupBy
reduceByKey(add)后:
key | value |
---|---|
a | 6 |
b | 4 |
c | 5 |
进行传输,这样现在本地合并计算,所以占用内存和网络传输都小。
注意与reduce进行区别,reduceByKey是相同的key进行合并计算,而reduce则是所有的都合并计算
即使用reduce(add)后:(add是已有的一种累加函数,可以自定义方法,传递得是上一个元素与丢面元素的value,add就是两个相加,sub就是相减)
value |
---|
15 |
三:reduceByKey与reduceByKeyLocall区别
reduce/reduceByKey 得到的结果返回对象都是RDD[K,V]形式;
reduceByKeLocal得到的返回对象是Map[Key,Value]形式。
四:combineByKey是实现reduceByKey/groupBy的更底层的高阶函数,可进一步自定义合并计算函数(可实现平均数等操作)
查看combineByKey的介绍:https://www.jianshu.com/p/b77a6294f31c
五:aggregateByKey
也是一套高阶的map/reduce操作的的东西,区别于aggregate来对相同的key进行聚合操作计算。
查看aggregateByKey的介绍:https://www.jianshu.com/p/09912beb1350