Вы можете использовать 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|
+-------+------+------+------+
Pivot - ваш друг! ;) –