Позвольте мне создать образец кадра данных Spark с двумя столбцами.
df = SparkSQLContext.createDataFrame([[1, 'r1'],
[1, 'r2'],
[1, 'r2'],
[2, 'r1'],
[3, 'r1'],
[3, 'r2'],
[4, 'r1'],
[5, 'r1'],
[5, 'r2'],
[5, 'r1']], schema=['col1', 'col2'])
df.show()
+----+----+
|col1|col2|
+----+----+
| 1| r1|
| 1| r2|
| 1| r2|
| 2| r1|
| 3| r1|
| 3| r2|
| 4| r1|
| 5| r1|
| 5| r2|
| 5| r1|
+----+----+
После группировки по столбцу col1 мы получаем объект GroupedData (вместо Spark Dataframe). Вы можете использовать агрегатные функции, такие как минимальная, максимальная, средняя. Но получить голову () немного сложно. Нам нужно преобразовать объект GroupedData обратно в Spark Dataframe. Это можно сделать с помощью функции агрегирования pyspark collect_list()
.
from pyspark.sql import functions
df1 = df.groupBy(['col1']).agg(functions.collect_list("col2")).show(n=3)
Вывод:
+----+------------------+
|col1|collect_list(col2)|
+----+------------------+
| 5| [r1, r2, r1]|
| 1| [r1, r2, r2]|
| 3| [r1, r2]|
+----+------------------+
only showing top 3 rows