Spark数据帧reducebykey就像操作一样

时间:2015-12-13 09:53:32

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

我有一个包含以下数据的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 个答案:

答案 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")

另见DataFrame / Dataset groupBy behaviour/optimization

答案 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