我在日期分区了一个Hive表。我希望能够有选择地覆盖最近'n'天(或自定义分区列表)的分区。
如果没有为每个分区编写“INSERT OVERWRITE DIRECTORY”语句,有没有办法呢?
非常感谢任何帮助。
答案 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;