Как получить первое и последнее значение из столбца dataframe в pyspark? - PullRequest
0 голосов
/ 04 июня 2019

У меня есть Dataframe, я хочу получить первое и последнее значение из столбца DataFrame.

+----+-----+--------------------+
|test|count|             support|
+----+-----+--------------------+
|   A|    5| 0.23809523809523808|
|   B|    5| 0.23809523809523808|
|   C|    4| 0.19047619047619047|
|   G|    2| 0.09523809523809523|
|   K|    2| 0.09523809523809523|
|   D|    1|0.047619047619047616|
+----+-----+--------------------+

ожидаемый вывод - сначала из столбца поддержки, последнее значение, т.е. x=[0.23809523809523808,0.047619047619047616.]

Ответы [ 2 ]

1 голос
/ 04 июня 2019

Вы можете использовать collect, но производительность будет ужасной, так как драйвер соберет все данные, только чтобы сохранить первый и последний элементы.Хуже того, это, скорее всего, приведет к ошибке OOM и, следовательно, вообще не будет работать, если у вас большой фрейм данных.

Другая идея - использовать agg с агрегацией first и lastфункция.Это не работает!(поскольку редукторы не обязательно получают записи в порядке кадра данных)

Spark предлагает функцию head, которая делает получение первого элемента очень простым.Тем не менее, спарк не предлагает никакой функции last.Простым подходом было бы отсортировать фрейм данных в обратном направлении и снова использовать функцию head.

first=df.head().support
import pyspark.sql.functions as F
last=df.orderBy(F.monotonically_increasing_id().desc()).head().support

Наконец, поскольку стыдно сортировать фрейм данных просто для получения его первого и последнего элементов, мы можемиспользуйте API RDD и zipWithIndex для индексации кадра данных и сохраните только первый и последний элементы.

size = df.count()
df.rdd.zipWithIndex()\
  .filter(lambda x : x[1] == 0 or x[1] == size-1)\
  .map(lambda x : x[0].support)\
  .collect()
0 голосов
/ 04 июня 2019

Вы можете попробовать проиндексировать фрейм данных, см. Пример ниже:

df = <your dataframe>
first_record = df.collect()[0]
last_record = df.collect()[-1]
...