2017-01-31 4 views
2

У меня есть кадр данных выглядит следующим образом:Как «плотный» кадр данных в Спарк

item_id week_id sale amount 
1   1   10 
1   2   12 
1   3   15 
2   1   4 
2   2   7 
2   3   9 

Я хочу, чтобы преобразовать эту dataframe в новый кадр данных выглядит следующим образом:

item_id week_1  week_2  week_3 
1   10   12   15 
2   4   7   9 

Этот может быть легко сделано в R, но я не знаю, как сделать это с помощью искровой API, с Scala

+1

Pivot - ваш друг! ;) –

ответ

5

Вы можете использовать groupBy.pivot, а затем агрегировать sale_amount колонку, я п в этом случае, вы можете взять первое значение из каждой комбинации идентификаторов пункта и неделю, если не больше, чем одна строка в каждой комбинации:

df.groupBy("item_id").pivot("week_id").agg(first("sale_amount")).show 
+-------+---+---+---+ 
|item_id| 1| 2| 3| 
+-------+---+---+---+ 
|  1| 10| 12| 15| 
|  2| 4| 7| 9| 
+-------+---+---+---+ 

Вы можете использовать другие функции агрегации, если есть более чем одна строка для каждой комбинации item_id и week_id, тем суммы, например:

df.groupBy("item_id").pivot("week_id").agg(sum("sale_amount")).show 
+-------+---+---+---+ 
|item_id| 1| 2| 3| 
+-------+---+---+---+ 
|  1| 10| 12| 15| 
|  2| 4| 7| 9| 
+-------+---+---+---+ 

Чтобы получить правильные имена столбцов, вы можете преобразовать week_id колонки перед тем поворота:

import org.apache.spark.sql.functions._ 

(df.withColumn("week_id", concat(lit("week_"), df("week_id"))). 
    groupBy("item_id").pivot("week_id").agg(first("sale_amount")).show) 

+-------+------+------+------+ 
|item_id|week_1|week_2|week_3| 
+-------+------+------+------+ 
|  1| 10| 12| 15| 
|  2|  4|  7|  9| 
+-------+------+------+------+ 
+0

Спасибо, как автозаполнять «0», если нет значения «week_id» для некоторого item_id? – lserlohn

+1

Вы можете использовать 'na.fill (0)' для заполнения пропущенных значений 0. 'df.withColumn (" week_id ", concat (lit (" week_ "), df (" week_id "))). GroupBy (" item_id " ") .pivot (" week_id "). AGG (первый (" sale_amount ")). na.fill (0) .show)' – Psidom