如何在 Hive 上对未分区的 table 进行分区?

How to partition a non-partitioned table on Hive?

给定一个包含 360 天数据的 table,我们希望按日期对其进行分区以提高性能。我们是否需要为每个日期使用以下 SELECT 命令?还有更有效的方法吗?

INSERT INTO TABLE <new_table> Partition (dt='2015-07-01')
SELECT * from <table> WHERE dt='2015-07-01'

如果您的新 table 按 dt(日期)分区,您应该使用 Dynamic Partition。您不需要指定特定的分区(在本例中为日期)。通过这种方式,Hive 实现了所有不同的日期并自动进行分区。

记住设置这些标志:

set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;

首先让你的table:

create  db.my_table(column1 int, column2 string,
                     -- ...
)
comment 'I like paritioned tables'
partitioned by(dt string)
location '/path/to/file';

现在您可以将数据加载到 dt 分区中:

insert overwrite into table db.my_table partition (dt) select * from other_table;