Scala Spark在读取拼花文件时遇到的问题
我有两个拼花地板零件文件Scala Spark在读取拼花文件时遇到的问题,scala,apache-spark,parquet,apache-spark-dataset,Scala,Apache Spark,Parquet,Apache Spark Dataset,我有两个拼花地板零件文件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日运行的部分文件),并且两者具有相同的模式(我通过打印模式验证了这一点) 我的问题是,我有,比如说10列,如果我使用Spark分别阅读这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日运行的部分文件),并且两者具有相同的模式(我通过打印模式验证了这一点)
我的问题是,我有,比如说10列,如果我使用Spark分别阅读这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
,它会抛出一个异常在数据架构和分区架构中发现重复的列:
[即将为空的列列表]。其中一个过滤器列为不明确,结果显示模式不完全匹配。列名的大小写(中间的一些字符)存在差异,它们的大小写为null。拼花地板的列名是区分大小写的,所以这导致了所有的问题。它试图阅读根本不存在的专栏