Проблемы с искрой при чтении паркетных файлов
У меня есть 2 паркетных файла part-00043-0bfd7e28-6469-4849-8692-e625c25485e2-c000.snappy.parquet
(это файл с 2017 года, 14 ноября) и part-00199-64714828-8a9e-4ae1-8735-c5102c0a834d-c000.snappy.parquet
(это файл детали с 2017 года, 16 ноября) и оба имеют одинаковую схему (которую я проверял схемой печати).
Моя проблема в том, что у меня есть, скажем, 10 столбцов, которые появляются правильно, если я читаю эти 2 файла отдельно, используя Spark. Но если я добавлю этот файл в папку, попробуйте прочитать вместе, общее количество будет правильным (сумма строк из 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 ответ
Оказывается, схемы там, где нет точного совпадения. Существовали различия в регистре (какой-то символ между ними) для имен столбцов, которые были равны нулю. И имена столбцов паркета чувствительны к регистру, так что это вызывало все проблемы. Он пытался читать столбцы, которых там не было вообще.