2015-12-13 2 views
2

У меня есть искра dataframe со следующими данными (я использую искровой CSV для загрузки данных в):искры dataframe reducebykey как операции

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

есть что-либо подобное, чтобы зажечь RDD reduceByKey, который может вернуть искру DataFrame как: (в основном, суммируя для одних и тех же ключевых значений)

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

(я могу преобразовать данные в РДУ и сделать reduceByKey операцию, но есть более Спарк DataFrame API способ сделать это?)

ответ

8

Если вы не заботитесь об именах столбцов, которые можно использовать 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") 
+0

Спасибо. Это работает очень хорошо. –

+1

В RDD API я использую 'reduceByKey', поскольку' groupByKey' собирает все значения для ключа в память - если ключ связан со многими значениями, у рабочего может закончиться нехватка памяти. У 'groupBy' тоже есть это ограничение? – jeffreyveon

+0

@jeffreyveon http://stackoverflow.com/q/32902982/1560062, но a) существует более одного механизма фактического groupBy в Spark. Б) если агрегировать подобные операции, все же можно получить OOM по разным причинам. – zero323

Смежные вопросы