gpt4 book ai didi

apache-spark - 阅读时忽略了 Spark 中已排序文件的 Parquet 摘要文件 (_metadata)?

转载 作者:可可西里 更新时间:2023-11-01 16:35:28 34 4
gpt4 key购买 nike

我有一个包含不同列和 ID 的排序数据集。数据集已排序(也使用 parquet-tools 验证):示例:

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>

我还启用了日志记录,可以看到读取了多个文件以获取每个文件的元数据。我在 s3 的这个“目录”中有 10000 个文件,所以从文件中检索所有元数据需要很多时间

为什么 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")

最佳答案

Parquet 摘要文件被认为实际上是无用的,并且在 SPARK-15719 中禁用了对它们的写入支持。 .该 JIRA 中提到的推理建议摘要文件仅用于读取架构,而不用于其他元数据,例如可能对过滤有用的最小/最大统计信息。我无法确认是否确实如此,但这里是该推理的摘录:

Parquet summary files are not particular useful nowadays since

  1. when schema merging is disabled, we assume schema of all Parquet part-files are identical, thus we can read the footer from any part-files.
  2. when schema merging is enabled, we need to read footers of all files anyway to do the merge.

根据这段摘录,需要读取每个文件页脚也可能是由schema merging引起的被启用,尽管如果摘要文件真的只用于架构,那么我认为无论如何都必须读取文件页脚。

如果按 ID 查询对您来说是一个频繁的操作,您可以考虑按 ID 对表进行分区以避免不必要的读取文件。

关于apache-spark - 阅读时忽略了 Spark 中已排序文件的 Parquet 摘要文件 (_metadata)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54293831/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com