Паркетный тип данных Issue - PullRequest
0 голосов
/ 17 мая 2018

У меня есть куча файлов паркета, и я создал внешние таблицы, используя Impala's CREATE EXTERNAL TABLE....

Однако, когда я выпустил

select * from my_table

вернул

ОШИБКА: файл 'hdfs: // xyz ..' имеет несовместимую схему Parquet для столбца 'xyz'. Тип столбца: DECIMAL (5, 2), схема Parquet: необязательный int32 final_apr [i: 4 d: 1 r: 0].

Итак, я внимательно посмотрел на вывод команды

parquet-tools schema my_parquet

и заметил, что все столбцы, которые INT64, но не fixed_len_byte_array, имеют эту проблему.

Поэтому я вручную выполнил команду

ALTER TABLE schema.table_name CHANGE old-column new_column BIGINT; 

чтобы изменить тип столбца, который он создал по умолчанию, на BIGINT за https://www.cloudera.com/documentation/enterprise/5-6-x/topics/impala_parquet.html,, тогда я смог выполнить select * from my_table;

Я выполнил вышеупомянутое в scala с использованием spark, то есть я смог прочитать файл паркета и сохранить его в виде таблицы impala, а также программно выполнить запрос «select * from my_table».

Однако я попытался выполнить запрос вручную из оболочки impala, но у меня возникла та же ошибка, показанная выше.

Вместо того, чтобы вручную обновлять столбцы для изменения типа данных всего INT64 байтового массива нефиксированной длины, есть ли лучший способ справиться с этим? Может быть, что-то вроде после чтения файла паркета как Dataframe, найти все INT64 столбцы байтового массива не фиксированной длины, преобразовать их в BIGINT и затем сохранить кадр данных как таблицу?

Кстати, я не могу выполнить запрос select * from my_from; в оболочке улья даже после изменения типа данных столбца. Я получаю сообщения об ошибках

Ошибка: ошибка при компиляции оператора: СБОЙ: ParseException строка 1:30 посторонний ввод «предел», ожидающий число рядом с «(состояние = 42000, код = 40000).

Я пытался с парой таблиц, все они имеют одинаковую проблему с оболочкой улья.

Ценю вашу помощь!

1 Ответ

0 голосов
/ 17 мая 2018

Предупреждение паркетной схемы int32 означает, что тип столбца импалы должен быть int, а не bigint.Когда вы изменяете столбец таблицы на int, он должен работать.Кстати, методы чтения паркетной и импала-паркет разные.Импала следует более консервативному способу чтения паркетных файлов.Например;spark не контролирует количество значений в разных индексах столбцов, в то время как impala делает.

...