Spark发布阅读镶木地板文件

时间:2017-11-20 18:30:13

标签: scala apache-spark parquet apache-spark-dataset

我有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个文件中的行总和),但是从第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: [无效的列列表] 。其中一个过滤列为ambiguous

1 个答案:

答案 0 :(得分:0)

原来那些模式不完全匹配。对于列名称为空的情况(其间的某些字符)存在差异。镶木地板列名称区分大小写,因此导致所有问题。它试图读取根本不存在的列。