为什么Spark的数据集中没有reduceBykey

时间:2019-08-05 13:07:03

标签: scala apache-spark apache-spark-sql

在此answer中,大多数答案都介绍了foreach( $_POST['item'] as $item) { $item['part_number']; $item['description]; } + groupByKey策略。但是,我找不到关于为何spark删除reduceGroups API的任何评论。有评论说,Sparks的Catalyst Optimizer可以减少一些计算,这可以解释原因。但是,根据作者和我的测试,数据集的reduceByKey + groupByKey策略比reduceGroups慢得多。

那么为什么reduceByKey被删除了,我怎么能找到替代方法呢?

1 个答案:

答案 0 :(得分:0)

该答案中的注释表明,从Spark 2.1.0开始,数据集上的groupByKey和reduceGroups的行为与RDD上的reduceByKey操作相同。

https://issues.apache.org/jira/browse/SPARK-16391

Spark尚未删除reduceByKey API。要使用reduceByKey,您的数据必须为RDD对类型。例如,如果您有一个数据集并想尝试使用reduceByKey,则必须执行以下操作:

df
 .map(row => (row.key, row.value))
 .rdd
 .reduceByKey((a,b) => SomeReductionFunction(a,b))
 .values
 .toDF()

请注意,第二行将您的数据集行转换为带有2个“列”(一个键和一个值)的RDD,因为reduceByKey需要一对RDD。 如果您已经具有数据集类型,则此方法也不起作用,因为它将数据集转换为rdd,然后如果要继续对数据集进行操作,则会将其转换为数据框或数据集。