Загрузка файла SPARK Parquet с другой схемой - PullRequest
0 голосов
/ 13 июля 2020

У нас есть паркетные файлы, созданные с двумя разными схемами, в которых есть поля ID и Amount.
Файл:
file1.snappy.parquet
ID: INT
AMOUNT: DECIMAL (15,6)
Содержимое:
1,19500,00
2,198,34


file2.snappy.parquet
ID: INT
AMOUNT: DECIMAL (15,2)
Содержимое:
1,19500,00
3,198,34

Когда я загружаю оба файла вместе df3 = spark.read.parquet ("output /") и пытаюсь получить данные, он выводит схему Decimal (15,6) для файла, который имеет количество с Decimal (16,2), и данные этих файлов обрабатываются неправильно. Есть ли способ, которым я могу правильно получить данные для этого случая.

Окончательный результат, который я мог увидеть после выполнения df3.show ()
+ --- + -------- --------- +
| ID | СУММА |
+ --- + ----------------- +
| 1 | 1.950000 |
| 3 | 0,019834 |
| 1 | 19500.000000 |
| 2 | 198.340000 |
+ --- + ----------------- +

Здесь, если вы видите для 1-й и 2-й строки, сумма была изменена неправильно.

Ищу некоторые предложения по этому поводу. Я знаю, что если мы регенерируем файлы с той же схемой, эта проблема исчезнет go, это потребует регенерации и замены доставленных файлов, есть ли какой-либо другой временный способ, который мы можем использовать и иметь в виду, пока мы будем работать над восстановлением этих файлов .

~ R, Кри sh

Ответы [ 2 ]

1 голос
/ 13 июля 2020

Вы можете попробовать, используя свойство mergeSchema как true. Поэтому вместо

df3 = spark.read.parquet("output/") 

попробуйте следующее:

df3 = spark.read.option("mergeSchema","true").parquet("output/")

Это должно сработать в вашем случае.

0 голосов
/ 13 июля 2020

Попробуйте прочитать это как строку и предоставить схему вручную при чтении файла

schema = StructType([
StructField("flag_piece", StringType(), True)
])

spark.read.format("parquet").schema(schema).load(path)
...