Как вставить из запроса select с динамическим разбиением на столбец в Hive? - PullRequest
0 голосов
/ 14 мая 2018

Я пытаюсь вставить вычисляемый раздел.Значение раздела должно быть вычислено из ключевого столбца.Предположим, что key_2 в примере всегда имеет 10 символов.Последние 3 символа, которые я хочу использовать в разделе.Мне нужно динамическое разбиение.

Моя таблица похожа на эту:

DROP TABLE exampledb.exampletable;
CREATE TABLE exampledb.exampletable (
    key_1 STRING,
    key_2 STRING,
    col_1 STRING,
    col_2 STRING
)
PARTITIONED BY (my_part STRING)
ROW FORMAT DELIMITED
  FIELDS TERMINATED BY '\u0001'
;

Я пробовал несколько вариантов HQL ниже:

INSERT OVERWRITE TABLE exampledb.exampletable
PARTITION(my_part)
SELECT 
    key_1,
    key_2,
    col_1,
    col_2,
    SUBSTR(key_2, -3) as my_part    -- not sure how to insert partition
FROM exampledb.exampletable_temp;

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

Знает ли Enyone решение для этого?Спасибо

ОБНОВЛЕНИЕ:

FAILED: SemanticException Partition spec {my_part=null} contains non-partition columns

ОБНОВЛЕНИЕ 2:

Я также пытался избежать значений NULLиспользуя это решение (как было предложено ниже, но ошибка та же):

INSERT OVERWRITE TABLE hvdb_as_aqua_guk_core.hvtb_aqua_guk_finding_mgn
PARTITION(my_part) ( key_1, key_2, col_1, col_2, my_part    )
SELECT 
        key_1,
        key_2,
        col_1,
        col_2,
        SUBSTR(key_2, -3) as my_part    -- not sure how to insert partition
FROM hvdb_as_aqua_guk_core.hvtb_aqua_guk_finding_mgn_temp2
WHERE key_2 IS NOT NULL
    AND SUBSTR(key_2, -3) IS NOT NULL;

1 Ответ

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

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

INSERT OVERWRITE TABLE exampledb.exampletable
PARTITION(my_part)(key_1, key_2, col_1, col_2, my_part)
SELECT 
    key_1,
    key_2,
    col_1,
    col_2,
    SUBSTR(key_2, -3)
FROM exampledb.exampletable_temp;

Это должно работать.

UPDATE

Я пытался создать тестовый пример, и INSERT OVERWRITE, похоже, не работает, но INSERT INTO работает. Обходным путем может быть удаление всех данных из таблицы назначения с помощью TRUNCATE TABLE exampledb.exampletable или удаление всех данных из определенного раздела с помощью TRUNCATE TABLE test6 PARTITION (my_part = '001');, а затем выполнение INSERT INTO:

INSERT INTO exampledb.exampletable
PARTITION(my_part)(key_1, key_2, col_1, col_2, my_part)
SELECT
    key_1,
    key_2,
    col_1,
    col_2,
    SUBSTR(key_2, -3)
FROM exampledb.exampletable_temp;
...