Hive:插入覆盖多个分区

时间:2013-09-06 22:32:20

标签: hadoop hive

我在日期分区了一个Hive表。我希望能够有选择地覆盖最近'n'天(或自定义分区列表)的分区。

如果没有为每个分区编写“INSERT OVERWRITE DIRECTORY”语句,有没有办法呢?

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:19)

Hive支持动态分区,因此您可以构建一个查询,其中分区只是源字段之一。

INSERT OVERWRITE TABLE dst partition (dt) 
SELECT col0, col1, ... coln, dt from src where ...

where子句可以指定要覆盖的dt值。

只需在源列表的最后一行中包含分区字段(本例中为dt),如果dt字段已经是源代码的一部分甚至SELECT *, dt等,您甚至可以SELECT *,my_udf(dt) as dt

默认情况下,Hive希望至少有一个指定的分区是静态的,但您可以允许它是 nonstrict ;因此,对于上述查询,您可以在运行之前设置以下内容:

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

答案 1 :(得分:0)

尝试一下。这将从*中排除dt,然后添加dt将根据需要设置顺序:

SET hive.support.quoted.identifiers=none;
INSERT OVERWRITE TABLE dst partition (dt)
SELECT `(dt)?+.+`, dt from tableName;