Spark DataFrame 的 reduceByKey 操作类似于什么?

15

我有一个Spark数据框,其中包含以下数据(我使用spark-csv加载数据):

key,value
1,10
2,12
3,0
1,20

有没有类似于Spark RDD reduceByKey的东西,可以返回一个Spark DataFrame,如下所示:(基本上是对相同键值进行求和)

key,value
1,30
2,12
3,0

我可以将数据转换为RDD并执行reduceByKey操作,但是否有更多基于Spark DataFrame API的方式来完成这个操作呢?

3个回答

25

如果您不关心列名,可以使用groupBysum

df.groupBy($"key").sum("value")

否则最好使用agg替换sum

df.groupBy($"key").agg(sum($"value").alias("value"))

最后,您可以使用原始SQL:

df.registerTempTable("df")
sqlContext.sql("SELECT key, SUM(value) AS value FROM df GROUP BY key")

另请参阅DataFrame / Dataset groupBy行为/优化


6
在RDD API中,我使用reduceByKey,因为groupByKey会将一个key对应的所有值都收集到内存中 - 如果一个key有很多值与其关联,那么一个worker可能会用尽内存。groupBy也有这种限制吗? - jeffreyveon
2
@jeffreyveon https://dev59.com/-1wY5IYBdhLWcg3wLFSw 但是a) Spark中实际groupBy有不止一种机制 b) 如果类似于聚合的操作,仍然可能因为不同原因导致OOM。 - zero323
你能进一步评论一下“如果你不关心列名…”吗?在这种情况下,列名会发生什么事情,确切地说? - justanotherbrain
2
@justanotherbrain 列名将类似于 _c1、_c2 等,而不是使用“别名”时的“value”。 - Sai Kiriti Badam

2

我认为用户goks在代码中错过了一些部分。这不是经过测试的代码。

应该使用.map将rdd转换为pairRDD,使用.map(lambda x: (x,1)).reduceByKey。

reduceByKey不适用于单值rdd或常规rdd,而是适用于pairRDD。

谢谢

Original Answer翻译成"最初的回答"


0

这样怎么样?我同意这仍然会转换为RDD然后转换为DataFrame。

df.select('key','value').map(lambda x: x).reduceByKey(lambda a,b: a+b).toDF(['key','value'])

1
为什么需要.map(lambda x: x) - Michael Tamillow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接