Spark数据帧reducebykey就像操作一样

Car*_*Pun 8 sql scala apache-spark apache-spark-sql

我有一个带有以下数据的Spark数据帧(我使用spark-csv来加载数据):

key,value
1,10
2,12
3,0
1,20
Run Code Online (Sandbox Code Playgroud)

有什么类似于spark RDD reduceByKey可以返回Spark DataFrame :(基本上,总结相同的键值)

key,value
1,30
2,12
3,0
Run Code Online (Sandbox Code Playgroud)

(我可以将数据转换为RDD并执行reduceByKey操作,但是有更多Spark DataFrame API方法可以执行此操作吗?)

zer*_*323 18

如果您不关心列名,可以使用groupBy后跟sum:

df.groupBy($"key").sum("value")
Run Code Online (Sandbox Code Playgroud)

否则最好更换sumagg:

df.groupBy($"key").agg(sum($"value").alias("value"))
Run Code Online (Sandbox Code Playgroud)

最后你可以使用原始SQL:

df.registerTempTable("df")
sqlContext.sql("SELECT key, SUM(value) AS value FROM df GROUP BY key")
Run Code Online (Sandbox Code Playgroud)

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

  • 在RDD API中,我使用`reduceByKey`,因为`groupByKey`会将键的所有值收集到内存中-如果键与许多值相关联,则工作程序可能会耗尽内存。`groupBy`也有这个限制吗? (2认同)
  • @jeffreyveon http://stackoverflow.com/q/32902982/1560062 但是a)Spark中实际的groupBy机制不止一种b)如果像聚合这样的操作,仍然有可能因为不同的原因而获得OOM。 (2认同)
  • @justanotherbrain cloumn 名称将是 _c1、_c2 等行中的内容,而不是“值” - 当您使用“别名”时的情况。 (2认同)