【问题标题】:Hive : Insert overwrite multiple partitionsHive:插入覆盖多个分区
【发布时间】:2013-09-06 22:32:19
【问题描述】:

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

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

非常感谢任何帮助。

【问题讨论】:

    标签: hadoop hive


    【解决方案1】:

    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;
    

    【讨论】:

    • 如果我这样做 SELECT *, dt 它抱怨我要插入更多列。这是有道理的,因为dt 也是* 的一部分。如果我这样做SELECT col0, col1, ... coln, dt from src where 它会抱怨Partition spec {dt=, DT=12} contains non-partition columns; 知道吗?似乎喜欢在分区列中发布案例,但我都尝试了
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-03-01
      • 1970-01-01
      • 2015-01-10
      • 2014-11-27
      • 1970-01-01
      • 1970-01-01
      • 2015-10-20
      • 2018-10-03
      • 2021-11-10
      相关资源
      最近更新 更多