Spark 读取镶木地板文件时出现问题
Posted
技术标签:
【中文标题】Spark 读取镶木地板文件时出现问题【英文标题】:Spark issues reading parquet files 【发布时间】:2017-11-20 18:30:13 【问题描述】:我有 2 个镶木地板零件文件 part-00043-0bfd7e28-6469-4849-8692-e625c25485e2-c000.snappy.parquet
(是 2017 年 11 月 14 日运行的零件文件)和 part-00199-64714828-8a9e-4ae1-8735-c5102c0a834d-c000.snappy.parquet
(是 2017 年 11 月 16 日运行的部分文件)并且两者都具有相同的架构(我通过打印架构进行了验证)。
我的问题是,如果我使用 Spark 分别读取这 2 个文件,那么我有 10 个列将正确显示。但是如果我把这个文件放在文件夹中,试图一起读取,总计数是正确的(来自 2 个文件的行总和),但来自第 2 个文件的大多数列都是空的。只有一些 2 3 列具有正确的值(值存在于文件中,因为如果我单独阅读它会正确显示)。我在这里想念什么?这是我用于测试的代码:
def initSparkConfig: SparkSession =
val sparkSession: SparkSession = SparkSession
.builder()
.appName("test")
.master("local")
.getOrCreate()
sparkSession.sparkContext.hadoopConfiguration.set("mapreduce.fileoutputcommitter.algorithm.version", "2")
sparkSession.sparkContext.getConf.set("spark.hadoop.parquet.enable.summary-metadata", "false")
sparkSession.sparkContext.getConf.set("spark.sql.parquet.mergeSchema", "false")
sparkSession.sparkContext.getConf.set("spark.sql.parquet.filterPushdown", "false")
sparkSession.sparkContext.getConf.set("spark.sql.hive.metastorePartitionPruning", "true")
sparkSession
sparkSession = initSparkConfig
sparkSession.read.parquet("/test_spark/").createOrReplaceTempView("table")
sparkSession.sql("select * from table").show
更新:
如果我分别读取这两个文件并进行联合并读取,所有列都会被填充而没有任何问题。
更新 2:
如果我在阅读时创建mergeSchema = true
,它会抛出异常Found duplicate column(s) in the data schema and the partition schema:
[List of columns which arecoming null]。过滤列之一为ambiguous
【问题讨论】:
【参考方案1】:结果表明架构不完全匹配。对于作为空值的列名,大小写(中间的某些字符)有所不同。并且 parquet 列名区分大小写,所以这导致了所有问题。它试图读取根本不存在的列。
【讨论】:
以上是关于Spark 读取镶木地板文件时出现问题的主要内容,如果未能解决你的问题,请参考以下文章
在 Python Pandas 中使用 read_parquet 从 AWS S3 读取镶木地板文件时出现分段错误