pyspark-эквивалент pandas groupby ('col1'). col2.head () - PullRequest
0 голосов
/ 09 мая 2018

У меня есть Spark Dataframe, где для каждого набора строк с данным значением столбца (col1) я хочу получить выборку значений в (col2). Количество строк для каждого возможного значения col1 может широко варьироваться, поэтому я просто ищу набор, скажем, 10, каждого типа.

Возможно, есть лучший способ сделать это, но естественным подходом, по-видимому, является df.groupby ('col1')

в пандах я мог бы сделать df.groupby ('col1'). Col2.head ()

Я понимаю, что искровые фреймы данных - это не фреймы панд, но это хорошая аналогия.

Полагаю, я мог бы перебрать все типы столбцов в качестве фильтра, но это выглядит ужасно странно.

есть мысли о том, как это сделать? Благодарю.

1 Ответ

0 голосов
/ 09 мая 2018

Позвольте мне создать образец кадра данных 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
...