在Hive中插入包含分区字段的列的数据

时间:2018-03-28 10:06:55

标签: 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');

如何在插入期间列出列名并动态放置分区值?以下命令不起作用:

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;

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

1 个答案:

答案 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