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