Поддерживает ли Spark паркетное разделение при чтении? - PullRequest
0 голосов
/ 13 июня 2018

У меня много проблем с поиском ответа на этот вопрос.Допустим, я пишу информационный кадр для паркета и использую repartition в сочетании с partitionBy, чтобы получить красиво разделенный файл паркета.См. Ниже:

df.repartition(col("DATE")).write.partitionBy("DATE").parquet("/path/to/parquet/file")

Теперь я хотел бы прочитать файл паркета, поэтому я делаю что-то вроде этого:

val df = spark.read.parquet("/path/to/parquet/file")

Разделен ли фрейм данных на "DATE"?Другими словами, если паркетный файл разбит на разделы, Spark поддерживает это разбиение при чтении его в фрейм данных Spark.Или это случайное разбиение?

Кроме того, почему и почему бы не ответить на этот вопрос.

1 Ответ

0 голосов
/ 16 августа 2018

Количество разделов, полученных при чтении данных, хранящихся в виде паркета, соответствует многим из тех же правил, что и чтение разделенного текста:

  1. Если SparkContext.minPartitions> = количество разделов в данных, SparkContext.minPartitions будетвозвращено.
  2. Если в данных учитывается количество разделов> = SparkContext.parallelism, SparkContext.parallelism будет возвращен, хотя в некоторых очень небольших случаях разделов может быть # 3.
  3. Наконец, есликоличество разделов в данных находится где-то между SparkContext.minPartitions и SparkContext.parallelism, обычно вы видите разделы, отраженные в разбиении набора данных.

Обратите внимание, что файл разделенного паркета редко имеет полныйлокальность данных для раздела, что означает, что , даже если количество разделов в данных соответствует количеству прочитанных разделов , существует большая вероятность того, что набор данных должен быть перераспределен в памяти, если вы пытаетесь получить данные разделаместность для выполненияАнс.

Учитывая вышеописанный вариант использования, я бы рекомендовал немедленно перераспределить столбец «ДАТА», если вы планируете использовать локальные операции над разделами на этой основе.Приведенные выше предостережения относительно настроек minPartitions и параллелизма применимы и здесь.

val df = spark.read.parquet("/path/to/parquet/file")
df.repartition(col("DATE"))
...