按现有字段划分Hive表?

bat*_*man 6 hadoop hive partitioning database-partitioning hdfs

我可以在插入现有字段时对Hive表进行分区吗?

我有一个10 GB的文件,其中包含日期字段和一小时的字段.我可以将此文件加载到表中,然后插入覆盖到另一个使用这些字段作为分区的分区表吗?会有类似下面的工作吗?

INSERT OVERWRITE TABLE tealeaf_event  PARTITION(dt=evt.datestring,hour=evt.hour) 
SELECT * FROM staging_event evt;
Run Code Online (Sandbox Code Playgroud)

谢谢!

特拉维斯

Dan*_*man 14

我只是碰到了这个尝试回答同样的问题,这很有帮助但不完全.简短的回答是肯定的,像问题中的查询一样可行,但语法不太正确.

假设您有三个使用以下语句创建的表:

CREATE TABLE staging_unpartitioned (datestring string, hour int, a int, b int);

CREATE TABLE staging_partitioned (a int, b int) 
    PARTITIONED BY (datestring string, hour int);

CREATE TABLE production_partitioned (a int, b int) 
    PARTITIONED BY (dt string, hour int);
Run Code Online (Sandbox Code Playgroud)

ab只是一些示例列.dt并且hour是一旦到达生产表我们想要分区的值.将登台数据移至生产staging_unpartitioned并且staging_partitioned看起来完全相同.

INSERT OVERWRITE TABLE production_partitioned PARTITION (dt, hour)
    SELECT a, b, datestring, hour FROM staging_unpartitioned;

INSERT OVERWRITE TABLE production_partitioned PARTITION (dt, hour)
    SELECT a, b, datestring, hour FROM staging_partitioned;
Run Code Online (Sandbox Code Playgroud)

这使用一个名为动态分区的过程,您可以在这里阅读.需要注意的重要一点是哪些列与SELECT顺序确定的哪些分区相关联.必须最后按顺序选择所有动态分区.

当您尝试运行上面的代码时,很有可能由于您设置的属性而出现错误.首先,如果禁用动态分区,它将无法工作,因此请确保:

set hive.exec.dynamic.partition=true;
Run Code Online (Sandbox Code Playgroud)

如果您未在动态分区之前对至少一个静态分区进行分区,则可能会遇到错误.当您打算使用动态分区覆盖其子分区时,此限制可以避免意外删除根分区.根据我的经验,这种行为从来没有帮助过,而且经常很烦人,但你的里程可能会有所不同.无论如何,它很容易改变:

set hive.exec.dynamic.partition.mode=nonstrict;
Run Code Online (Sandbox Code Playgroud)

这应该做到这一点.


Ola*_*laf -1

不可以。您必须删除该字段,或者至少重命名它。