我正在尝试插入一个计算分区。分区的值需要从键列计算出来。假设示例中的键2总是有10个字符。我想在分区中使用的最后3个字符。我需要动态分区。
我的table与此类似:
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:
我也尝试过使用此解决方案来避免空值(正如下面提出的,但错误是相同的):
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条答案
按热度按时间7fyelxc51#
应该显式指定要插入的所有列名。例如,您的命令应该是这样的:
这应该管用。
更新
我试着创建一个测试用例
INSERT OVERWRITE
似乎不管用,但是INSERT INTO
正在工作。一种解决方法是使用TRUNCATE TABLE exampledb.exampletable
,或使用删除特定分区中的所有数据TRUNCATE TABLE test6 PARTITION (my_part = '001');
,然后运行INSERT INTO
: