为啥 Spark 不能自动检测 Parquet 文件中的新字段?

Posted

技术标签:

【中文标题】为啥 Spark 不能自动检测 Parquet 文件中的新字段?【英文标题】:Why Is Spark NOT auto-detecting new fields in my Parquet files?为什么 Spark 不能自动检测 Parquet 文件中的新字段? 【发布时间】:2018-08-20 06:56:41 【问题描述】:

在下面的 Databricks 博客摘录中,声称,作为 Spark 1.3,如果随着时间的推移将新字段添加到 parquet 模式中,它们将被自动检测和处理(我假设为此插入 NULL在将其引入镶木地板文件之前的时间段中的字段)。

这个功能对我不起作用——例如,如果我使用这个命令来读取所有月份的数据:

df=spark.read.parquet('/mnt/waldo/mixpanel/formatted/parquet/')

然后尝试查询新添加的字段之一,截至 8 月,未找到。

但是,如果我只是阅读该月的数据:

df=spark.read.parquet('/mnt/waldo/mixpanel/formatted/parquet/eventmonth=2018-08-01')

那么该字段用于查询。

知道我做错了什么吗?谢谢!

在 Apache Spark 1.3 版本中,我们为此源添加了两个主要功能。首先,在 parquet 中存储大量数据的组织通常会发现自己随着时间的推移通过添加或删除列来演变模式。在此版本中,我们添加了一项新功能,该功能将扫描所有文件的元数据,合并模式以提供数据的统一表示。此功能允许开发人员读取架构超时更改的数据,而无需执行昂贵的手动转换。 https://databricks.com/blog/2015/03/24/spark-sql-graduates-from-alpha-in-spark-1-3.html

【问题讨论】:

【参考方案1】:

在读取 Parquet 文件时,需要特别要求在需要的时候合并 schema;否则,作为速度优化,Spark 将只读取遇到的第一个分区的架构,并假设所有分区都相同。

用途:

df=spark.read.option("mergeSchema","true").parquet('/mnt/waldo/mixpanel/formatted/parquet/')


【讨论】:

我尝试在编辑中更正此问题,但显然被拒绝:将 'mergedSchema' 更改为 'mergeSchema' 并且效果很好!谢谢rluta! 我已修正选项名称中的错字。感谢您的反馈。

以上是关于为啥 Spark 不能自动检测 Parquet 文件中的新字段?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Apache Spark 会读取嵌套结构中不必要的 Parquet 列?

为啥聚合的 Spark Parquet 文件比原始文件大?

为啥聚合的 Spark Parquet 文件比原始文件大?

spark剖析:spark读取parquet文件会有多少个task

spark剖析:spark读取parquet文件会有多少个task

spark剖析:spark读取parquet文件会有多少个task