pivot
- это функция, которую вы ищете.
df = spark.createDataFrame([
[2018, 2, 3, 0.8],
[2019, 4, 1, 0.2],
[2020, 2, 3, 0.1],
[2021, 10, 1, 0.5]
], ['C1', 'C2', 'C3', 'C4'])
df.show()
>>>
+----+---+---+---+
| C1| C2| C3| C4|
+----+---+---+---+
|2018| 2| 3|0.8|
|2019| 4| 1|0.2|
|2020| 2| 3|0.1|
|2021| 10| 1|0.5|
+----+---+---+---+
df2 = df.groupBy('C2', 'C3').pivot('C1').avg('C4')
df2.show()
>>>
+---+---+----+----+----+----+
| C2| C3|2018|2019|2020|2021|
+---+---+----+----+----+----+
| 2| 3| 0.8|null| 0.1|null|
| 10| 1|null|null|null| 0.5|
| 4| 1|null| 0.2|null|null|
+---+---+----+----+----+----+
Хотя вы не упоминаете, что должно произойти, если бы у нас было:
+----+---+---+---+
| C1| C2| C3| C4|
+----+---+---+---+
|2018| 2| 3|0.8|
|2018| 2| 3|0.3|
+----+---+---+---+
Вы можете изменитьповедение путем изменения функции агрегирования GroupedData (см. http://spark.apache.org/docs/latest/api/python/pyspark.sql.html#pyspark.sql.GroupedData).. Если вы хотите собрать все значения, вы можете использовать:
from pyspark.sql import functions as F
df2 = df.groupBy('C2', 'C3').pivot('C1').agg(F.collect_list('C4'))
df2.show()
>>>
+---+---+----------+
| C2| C3| 2018|
+---+---+----------+
| 2| 3|[0.8, 0.3]|
+---+---+----------+