Первый элемент каждого раздела dataframe Spark 2.0

Мне нужно получить первый элемент каждого раздела dataframe. Я знаю, что мне нужно использовать mapPartitions, но мне непонятно, как его использовать.

Примечание. Я использую Spark2.0, фрейм данных отсортирован.


person syl    schedule 28.09.2016    source источник


Ответы (1)


Я считаю, что это должно выглядеть примерно так:

import org.apache.spark.sql.catalyst.encoders.RowEncoder
...
implicit val encoder = RowEncoder(df.schema)
val newDf = df.mapPartitions(iterator => iterator.take(1))

Это займет 1 элемент из каждого раздела в DataFrame. Затем вы можете собрать все данные для своего водителя, т.е.:

nedDf.collect()

Это вернет вам массив с количеством элементов, равным количеству ваших разделов.

UPD обновлен для поддержки Spark 2.0.

person Zyoma    schedule 28.09.2016
comment
Я смотрю на сигнатуру метода здесь spark.apache.org/docs/latest/api/java/org/apache/spark/sql/ и задаетесь вопросом, не нужен ли вам Encoder в качестве второго параметра в этом вызове метода? - person MaxNevermind; 28.09.2016
comment
Попытка этого решения возвращает Невозможно найти кодировщик для типа, хранящегося в наборе данных. Примитивные типы (Int, String и т. д.) и типы продуктов (классы случаев) поддерживаются путем импорта spark.implicits._ даже при использовании spar.implicits ошибки сохраняются. - person syl; 28.09.2016
comment
Замена mapPartitions на foreachPartition работает, но возвращает пустой список () - person syl; 28.09.2016
comment
Вы имеете в виду collect ? Он возвращает массив строк. Операция mapPartitions без collect вернет новый кадр данных. - person Zyoma; 28.09.2016