在 Hive 中插入带有分区字段的数据列表列

And*_*rea 2 hadoop hive

首先我们来搭建一个测试环境:

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)

不管怎样,这个方法与列顺序严格限制?在现实场景中,我如何处理指定映射的大量列以避免错误?

âńō*_*oůŜ 5

当您想要列出特定列时插入分区表的语法如下所示。您不需要在 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)