如何在 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;
给定一个包含 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;