如何从具有动态分区的选择查询中插入 Hive 中的列?

Posted

技术标签:

【中文标题】如何从具有动态分区的选择查询中插入 Hive 中的列?【英文标题】:How to insert from a select query with dynamic partitioning on a column in Hive? 【发布时间】:2018-05-14 00:09:29 【问题描述】:

我正在尝试插入计算分区。 分区的值需要从键列计算。 假设示例中的 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;

我不知道什么是正确的解决方案。 我总是遇到语法错误。

有没有人知道这个问题的解决方案? 谢谢

更新:

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】:

您应该明确指定要插入的所有列名。例如,您的命令应该是这样的:

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;

这应该可行。

更新

我尝试创建一个测试用例,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;

【讨论】:

谢谢,但您的解决方案给出了这个错误:FAILED: ParseException line 5:32 cannot identify input near '(' 'key_1' ',' in statement 现在我在问题中看到了您的更新,您是否检查过 SUBSTR(key_2, -3) 始终返回非 NULL 值? 此 key_2 是记录的复杂键的一部分。该值存在于每条记录中... 我试图创建一个测试用例,INSERT INTO TABLE exampledb.exampletable 可以工作,但INSERT OVERWRITE TABLE exampledb.exampletable 不能工作。如果您想在插入新数据之前删除目标表中的所有数据,您可以运行TRUNCATE TABLE exampledb.exampletable,然后运行INSERT INTO 语句。 请注意,一切都意味着一切。如果您只想删除特定分区上的数据,则应使用此语法TRUNCATE TABLE exampledb.exampletable PARTITION (my_part = '001');

以上是关于如何从具有动态分区的选择查询中插入 Hive 中的列?的主要内容,如果未能解决你的问题,请参考以下文章

Hive 动态分区

Hive:插入覆盖多个分区

将数据插入 Hive 分区表时出错

如何从 hive 获取最新的分区数据

Hive如何根据表中某个字段动态分区

Hive动态分区