файл сводки паркета (_metadata) игнорируется для отсортированных файлов в Spark при чтении? - PullRequest
0 голосов
/ 21 января 2019

У меня есть отсортированный набор данных с разными столбцами и идентификатором. Набор данных сортируется (также проверяется с помощью паркетных инструментов): Пример:

file 1: ID 1-10
file 2: ID 10-12
file 3: ID 12-33
....

Я также создал и написал файл _metadata и _common_metadata. Я пытался запросить (очень большой) набор данных с помощью фильтра

val mydata=spark.read.parquet("s3a://.../mylocation")
val result = mydata.filter(mydata("id") === 11)
result.explain(true)

объяснение показало мне:

== Parsed Logical Plan ==
Filter (id#14L = 11)
+- Relation[fieldA#12, fieldB#13,id#14L] parquet

== Analyzed Logical Plan ==
fieldA: int, fieldB: string, id: bigint
Filter (id#14L = 11)
+- Relation[fieldA#12, fieldB#13,id#14L] parquet

== Optimized Logical Plan ==
Filter (isnotnull(id#14L) && (id#14L = 11))
+- Relation[fieldA#12, fieldB#13,id#14L] parquet

== Physical Plan ==
*(1) Project [fieldA#12, fieldB#13,id#14L]
+- *(1) Filter (isnotnull(id#14L) && (id#14L = 11))
   +- *(1) FileScan parquet [fieldA#12,fieldB#13,id#14L] Batched: true, Format: Parquet, Location: InMemoryFileIndex[s3a://mybucket/path/to/data], PartitionFilters: [], PushedFilters: [IsNotNull(id), EqualTo(id,11)], ReadSchema: struct<fieldA:int,fieldB:string,id:bigint>

Я также включил ведение журнала и мог видеть, что несколько файлов читаются для получения метаданных на файл. У меня есть 10000 файлов в этой «директории» в s3, поэтому получение всех метаданных из файлов занимает много времени

Почему spark не получает метаданные из файла _metadata? Есть ли возможность включить это? Я уже пробовал следующие варианты:

spark.conf.set("parquet.summary.metadata.level","ALL")
spark.conf.set("parquet.filter.statistics.enabled","true")
spark.conf.set("parquet.filter.dictionary.enabled","true")
spark.conf.set("spark.sql.parquet.filterPushdown","true")
spark.conf.set("spark.sql.hive.convertMetastoreParquet","true")
spark.conf.set("spark.sql.parquet.respectSummaryFiles","true")
spark.conf.set("spark.sql.parquet.mergeSchema","false")
spark.conf.set("spark.sql.hive.convertMetastoreParquet.mergeSchema","false")
spark.conf.set("spark.sql.optimizer.metadataOnly", "true")

1 Ответ

0 голосов
/ 22 января 2019

Сводные файлы паркета считались практически бесполезными, и поддержка записи для них была отключена в SPARK-15719 . Обоснование, упомянутое в том, что JIRA предполагает , что файлы сводки используются только для чтения схемы, а не другие метаданные, такие как статистика min / max, которые могут быть полезны для фильтрации. Я не могу подтвердить, так ли это на самом деле, но вот выдержка из этого рассуждения:

Сводные файлы паркета в настоящее время не особенно полезны, так как

  1. когда объединение схем отключено, мы предполагаем, что схемы всех файлов деталей Parquet идентичны, поэтому мы можем прочитать нижний колонтитул из любых файлов деталей.
  2. когда объединение схем включено, нам все равно нужно прочитать нижние колонтитулы всех файлов, чтобы выполнить объединение.

Согласно этому отрывку, необходимость прочитать каждый нижний колонтитул файла также может быть вызвана включением объединения схем , хотя если файлы сводки действительно используются только для схемы, то я думаю, что нижние колонтитулы файлов имеют быть прочитанным в любом случае.

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

...