首先让我们设置一个测试环境:
CREATE TABLE IF NOT EXISTS source_table (
`col1` TIMESTAMP,
`col2` STRING
);
CREATE TABLE IF NOT EXISTS dest_table (
`col1` TIMESTAMP,
`col2` STRING,
`col3` STRING
)
PARTITIONED BY (day STRING)
STORED AS AVRO;
INSERT INTO TABLE source_table VALUES ('2018-03-21 17:08:04.401', 'test1'), ('2018-03-22 12:02:04.222', 'test2'), ('2018-03-22 07:21:04.111', 'test3');
如何在插入期间列出列名并动态放置分区值?以下命令不起作用:
INSERT INTO TABLE dest_table(col1, col2) PARTITION(day) SELECT col1, col2, date_format(col1, 'yyyy-MM-dd') FROM source_table;
顺便说一下,如果没有在dest_table
命令中列出INSERT INTO
的列,有两个具有相同列号的表,一切正常。如果我的dest_table
字段多于source_table
?
感谢您帮助我。
P.S。
好的,如果我硬编码NULL
这就行了。我打开这个问题是因为可能有更好的方法来实现这个目标。
INSERT INTO TABLE dest_table PARTITION(day) SELECT col1, col2, NULL, date_format(col1, 'yyyy-MM-dd') FROM source_table;
无论如何,这个方法是严格限制列的顺序?在现实场景中,我如何处理指定映射的大量列,以避免错误?
答案 0 :(得分:2)
如果要列出特定列,则插入分区表的语法如下所示。您不需要在col3上放置null,因为Hive会将默认值设为NULL,因为它在插入期间不在列列表中。
INSERT INTO TABLE dest_table PARTITION (day)(col1, col2, day)
SELECT col1, col2, date_format(col1, 'yyyy-MM-dd') FROM source_table;
Result:
col1 col2 col3 day
2018-03-22 12:02:04.222 test2 NULL 2018-03-22
2018-03-22 07:21:04.111 test3 NULL 2018-03-22
2018-03-21 17:08:04.401 test1 NULL 2018-03-21