我有 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 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
事实证明,模式不完全匹配。列名的大小写存在差异(中间有一些字符),该列名为空。而且镶木地板列名称区分大小写,因此这导致了所有问题。它试图读取根本不存在的专栏。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)