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 读取镶木地板文件时出现分段错误

由于 ExecutorLostFailure,无法使用 spark 读取镶木地板文件

从 S3 复制镶木地板文件时出现 Vertica 性能问题

Spark:从镶木地板中读取一个 int 列,只要

在 AWS Glue 3.0 中使用 1900 之前的时间戳编写镶木地板时出现问题