我有一个包含以下数据的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方法可以做到这一点吗?)
答案 0 :(得分:17)
如果您不关心列名,可以使用groupBy
后跟sum
:
df.groupBy($"key").sum("value")
否则最好将sum
替换为agg
:
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")
答案 1 :(得分:0)
这个怎么样?我同意这仍然会转换为rdd然后转换为dataframe。
df.select('key','value').map(lambda x: x).reduceByKey(lambda a,b: a+b).toDF(['key','value'])
答案 2 :(得分:0)
我认为用户goks错过了代码中的某些部分。它不是经过测试的代码。
.map应该已经用于使用.map(lambda x:(x,1))。reduceByKey将rdd转换为pairRDD。 ....
reduceByKey在单个值rdd或常规rdd上不可用,而在pairRDD上可用。
Thx