Вы можете использовать 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()