2017-02-03 11 views
1

Я создал файл паркета, а затем я пытаюсь импортировать его в таблицу Impala.Impala + паркет файл

Я создал таблицу, как показано ниже:

CREATE EXTERNAL TABLE `user_daily` (
`user_id` BIGINT COMMENT 'User ID', 
`master_id` BIGINT, 
`walletAgency` BOOLEAN, 
`zone_id` BIGINT COMMENT 'Zone ID', 
`day` STRING COMMENT 'The stats are aggregated for single days', 
`clicks` BIGINT COMMENT 'The number of clicks', 
`impressions` BIGINT COMMENT 'The number of impressions', 
`avg_position` BIGINT COMMENT 'The average position * 100', 
`money` BIGINT COMMENT 'The cost of the clicks, in hellers', 
`web_id` BIGINT COMMENT 'Web ID', 
`discarded_clicks` BIGINT COMMENT 'Number of discarded clicks from column "clicks"', 
`impression_money` BIGINT COMMENT 'The cost of the impressions, in hellers' 
) 
PARTITIONED BY (
year BIGINT, 
month BIGINT 
) 
STORED AS PARQUET 
LOCATION '/warehouse/impala/contextstat.db/user_daily/'; 

Затем я скопировать файлы там с этой схемой:

parquet-tools schema user_daily/year\=2016/month\=8/part-r-00001-fd77e1cd-c824-4ebd-9328-0aca5a168d11.snappy.parquet 
message spark_schema { 
    optional int32 user_id; 
    optional int32 web_id (INT_16); 
    optional int32 zone_id; 
    required int32 master_id; 
    required boolean walletagency; 
    optional int64 impressions; 
    optional int64 clicks; 
    optional int64 money; 
    optional int64 avg_position; 
    optional double impression_money; 
    required binary day (UTF8); 
} 

А потом, когда я пытаюсь посмотреть записи с

SELECT * FROM user_daily; 

I get

File 'hdfs://.../warehouse/impala/contextstat.db/user_daily/year=2016/month=8/part-r-00000-fd77e1cd-c824-4ebd-9328-0aca5a168d11.snappy.parquet' 
has an incompatible Parquet schema for column 'contextstat.user_daily.user_id'. 
Column type: BIGINT, Parquet schema: 
optional int32 user_id [i:0 d:1 r:0] 

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

ответ

0

я использую CAST(... AS BIGINT), которые изменяют паркетную схему из int32 в int64. Затем мне приходится переупорядочивать столбцы, потому что он не присоединяется потом по имени. Тогда это работает.

1

BIGINT - int64, поэтому он жалуется. Но вам необязательно определять разные типы, которые вы должны использовать сами, Impala может сделать это для вас. Просто используйте CREATE TABLE LIKE PARQUET вариант:

The variation CREATE TABLE ... LIKE PARQUET 'hdfs_path_of_parquet_file' lets you skip the column definitions of the CREATE TABLE statement. The column names and data types are automatically configured based on the organization of the specified Parquet data file, which must already reside in HDFS.

+0

К сожалению, этот способ решения не является тем, что мне нужно. Существует определенная таблица со структурой выше, и я хотел бы придерживаться решения, где я меняю паркетные файлы. BTW: Я пытаюсь ... возникает следующая ошибка: 'ERROR: AnalysisException: Неподдерживаемый тип логического паркета INT_16 (примитивный тип - INT32) для поля web_id' – United121

+0

Сообщение об ошибке показывает, что нет типа, который вы могли бы указать в определении таблицы который будет совместим с тем, что содержит файл Parquet. Если вы хотите придерживаться определения таблицы и изменить схему Паркета, просто измените все экземпляры 'int32' на' int64' и удалите часть '(INT_16)'. – Zoltan

+0

Но как я могу удалить часть '(INT_16)' из этой схемы? Он отображается после вызова 'parquet-tools scheme' и описывает уже существующий файл? Есть ли способ изменить его в уже существующем файле? – United121