首先我们来搭建一个测试环境:
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');
Run Code Online (Sandbox Code Playgroud)
如何在插入期间列出列名并动态放置分区值?以下命令不起作用:
INSERT INTO TABLE dest_table(col1, col2) PARTITION(day) SELECT col1, col2, date_format(col1, 'yyyy-MM-dd') FROM source_table;
Run Code Online (Sandbox Code Playgroud)
顺便说一句,如果没有列出命令dest_table内部的列INSERT INTO,只要有两个具有相同列号的表,一切都可以正常工作。如果 my 的dest_table字段多于 的字段怎么办source_table?
感谢你们对我的帮助。
聚苯乙烯
好的,如果我硬编码NULL这有效。我保留这个问题是因为可能有更好的方法来实现这一目标。
INSERT INTO TABLE dest_table PARTITION(day) SELECT col1, col2, NULL, date_format(col1, 'yyyy-MM-dd') FROM source_table;
Run Code Online (Sandbox Code Playgroud)
不管怎样,这个方法与列顺序严格限制?在现实场景中,我如何处理指定映射的大量列以避免错误?
当您想要列出特定列时插入分区表的语法如下所示。您不需要在 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
Run Code Online (Sandbox Code Playgroud)