代码之家  ›  专栏  ›  技术社区  ›  Rijo Joseph

Spark读取拼花文件的问题

  •  2
  • Rijo Joseph  · 技术社区  · 7 年前

    我有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分别阅读这两个文件,我有10列。但是,如果我把这个文件放在一起尝试读取,总计数是正确的(两个文件中的行的总和),但从第二个文件中,大多数列为空。只有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: [即将为空的列列表] . 其中一个过滤柱为 ambiguous

    1 回复  |  直到 7 年前
        1
  •  1
  •   Rijo Joseph    7 年前

    结果表明,模式不完全匹配。对于即将为null的列名,大小写(中间的一些字符)存在差异。拼花地板列名区分大小写,因此这引发了所有问题。它试图读取根本不存在的列。