9

我有一个按日期分区的 Hive 表。我希望能够选择性地覆盖过去“n”天的分区(或自定义分区列表)。

有没有办法在不为每个分区编写“INSERT OVERWRITE DIRECTORY”语句的情况下做到这一点?

任何帮助是极大的赞赏。

4

2 回答 2

23

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

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

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

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

默认情况下,Hive 至少希望指定的分区之一是静态的,但您可以允许它是非严格的;所以对于上面的查询,可以在运行前进行如下设置:

set hive.exec.dynamic.partition.mode=nonstrict;
于 2013-09-09T16:15:36.990 回答
0

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

SET hive.support.quoted.identifiers=none;
INSERT OVERWRITE TABLE dst partition (dt)
SELECT `(dt)?+.+`, dt from tableName;
于 2020-01-04T21:24:49.453 回答