Impala создает паркетную таблицу с разделом из существующей таблицы Kudu

Я пытаюсь создать паркетную таблицу с разделом из существующей таблицы Kudu в Impala без необходимости повторного указания столбцов с типами данных.

CREATE TABLE IF NOT EXISTS db_name.parquet_table
PARTITIONED BY (`year` SMALLINT, `month` TINYINT, `day` TINYINT)
STORED AS PARQUET 
As SELECT * FROM db_name.kudu_table limit 0

Я получаю сообщение об ошибке, говорящее

ParseException: Syntax error in line 4:undefined: As SELECT * FROM db_name.parquet_table limit 0 ^ Encountered: AS Expected CAUSED BY: Exception: Syntax error

Но когда я пытаюсь создать паркетную таблицу без разделов, она работает, используя:

CREATE TABLE IF NOT EXISTS db_name.parquet_table STORED AS PARQUET  
AS SELECT * FROM db_name.kudu_table LIMIT 0 

Но когда я пытаюсь добавить раздел, используя:

ALTER TABLE db_name.parquet_table ADD PARTITION(`year`=0,`month`=0,`day`=0)

Я получаю следующее сообщение об ошибке:

AnalysisException: Table is not partitioned: db_name.parquet_table

person mongotop    schedule 20.07.2020    source источник


Ответы (1)


Вы можете попробовать загрузить данные с помощью

СТАТИЧЕСКОЕ РАЗДЕЛЕНИЕ

Одним из способов загрузки данных в секционированную таблицу является использование статического секционирования, при котором вы вручную определяете различные секции. (Другой способ — автоматически определить разделы при загрузке данных, это называется динамическим разделением.)

При статическом разделении вы создаете раздел вручную с помощью оператора ALTER TABLE … ADD PARTITION, а затем загружаете данные в раздел.

На вашем примере я бы попробовал это.

Первый. Создайте секционированную таблицу

CREATE TABLE IF NOT EXISTS db_name.parquet_table(field1 [TYPE],...,fieldN [TYPE]) --Fields that not belongs to the partitioned columns
PARTITIONED BY (year SMALLINT, month TINYINT, day TINYINT)
STORED AS PARQUET;

Второй. Оператор ALTER TABLE для создания раздела.

ALTER TABLE db_name.parquet_table ADD PARTITION(year = 0,month = 0,day = 0);

Обратите внимание, что имя столбца раздела и конкретное значение, определяющее этот раздел, указаны в предложении ADD PARTITION. Это создает каталог раздела внутри каталога таблицы.

После создания раздела вы можете добавить данные в раздел с помощью оператора INSERT … SELECT.

INSERT OVERWRITE TABLE db_name.parquet_table
    PARTITION(year = 0, month = 0, day = 0)
    SELECT field1,..., fieldn --do not include partitioned columns
    FROM db_name.kudu_table 
    WHERE year = 0 AND month = 0 AND day = 0;

При статическом разделении вам необходимо повторить эти два шага для каждого раздела: сначала создать раздел, а затем добавить данные. На самом деле вы можете использовать любой метод для загрузки данных; вам не нужно использовать оператор INSERT. Вместо этого вы можете использовать команды hdfs dfs или команду LOAD DATA INPATH. Но как бы вы ни загружали данные, вы должны следить за тем, чтобы данные хранились в правильных подкаталогах раздела.

person Chema    schedule 21.07.2020
comment
Спасибо Чема за подробный ответ! Я попытался запустить оператор CREATE TABLE и получил сообщение об ошибке AnalysisException: Table requires at least 1 column. - person mongotop; 21.07.2020
comment
Привет @mongotop, в create table вы должны поместить поля, которые не принадлежат разделенным столбцам. Например CREATE TABLE IF NOT EXISTS kudu_parquet( name STRING) PARTITIONED BY (year SMALLINT, month TINYINT, day TINYINT) STORED AS PARQUET; - person Chema; 21.07.2020
comment
Я внес некоторые изменения в сообщение, чтобы уточнить ответ. - person Chema; 21.07.2020
comment
Спасибо @chema за разъяснения! Я надеялся, что мне не нужно указывать имена столбцов для паркетной таблицы, поэтому моим пользователям нужно будет только создать свои таблицы Kudu, и я смогу автоматически создать для них паркетную таблицу на лету. как какое-то наследование столбцов от Kudu. Если это невозможно, я думаю, что было бы неплохо добавить эту функцию, чтобы убедиться в согласованности и избежать каких-либо пользовательских ошибок при создании представления UNION Kudu и паркетных таблиц. Ошибки типа данных, ошибки имен столбцов, ошибки порядка столбцов и тому подобное. - person mongotop; 22.07.2020
comment
Привет @mongotop, это интересно, ```` было бы неплохо добавить, чтобы убедиться в согласованности ````, я тоже так думаю. Если этот пост был полезен, пожалуйста, примите решение и проголосуйте, я был бы очень признателен. - person Chema; 22.07.2020
comment
Я смог сделать это простым способом. просто создайте таблицу со всеми именами столбцов и типами данных, разделы с начальным значением по умолчанию 0 для YEAR, МЕСЯЦ и DAY, а затем я беру метки времени из таблицы Kudu, чтобы извлечь YEAR, MONTH, DAY для вставки данных в этот раздел. Я придумал что-то новое, я вернусь, чтобы обновить ответ. Еще раз спасибо! - person mongotop; 22.07.2020