我有一个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的方式来完成这个操作呢?
我有一个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的方式来完成这个操作呢?
如果您不关心列名,可以使用groupBy
和sum
:
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")
我认为用户goks在代码中错过了一些部分。这不是经过测试的代码。
应该使用.map将rdd转换为pairRDD,使用.map(lambda x: (x,1)).reduceByKey。
reduceByKey不适用于单值rdd或常规rdd,而是适用于pairRDD。
谢谢
Original Answer翻译成"最初的回答"
这样怎么样?我同意这仍然会转换为RDD然后转换为DataFrame。
df.select('key','value').map(lambda x: x).reduceByKey(lambda a,b: a+b).toDF(['key','value'])
.map(lambda x: x)
? - Michael Tamillow
reduceByKey
,因为groupByKey
会将一个key对应的所有值都收集到内存中 - 如果一个key有很多值与其关联,那么一个worker可能会用尽内存。groupBy
也有这种限制吗? - jeffreyveon