1

在 Hive 中,为什么我不允许在动态分区下嵌套静态分区?

例如,以下是允许的

INSERT OVERWRITE TABLE T PARTITION (ds='2010-03-03', hr)
SELECT key, value, /*ds,*/ hr FROM srcpart WHERE ds is not null and hr>10;

但这是不允许的

INSERT OVERWRITE TABLE T PARTITION (ds, hr = 11)
SELECT key, value, ds/*, hr*/ FROM srcpart WHERE ds is not null and hr=11;

我发现官方 wiki 页面解释(如下所示)不足。更喜欢逻辑解释或底层 map-reduce 级别的解释。

SP is a subpartition of a DP: should throw an error because partition column order determins directory hierarchy. We cannot change the hierarchy in DML
4

1 回答 1

0

这是 Hive 设计问题(在此处指定):

如果有多个分区列,它们的顺序很重要,因为这转换为 HDFS 中的目录结构: partitioned by (ds string, dept int)意味着 ds=2009-02-26/dept=2.

在涉及分区表的 DML 或 DDL 中,如果指定了分区列的子集(静态),如果动态分区列较低,我们应该抛出错误。

例子:

create table nzhang_part(a string) partitioned by (ds string, dept int);
insert overwrite nzhang_part (dept=1)
  select a, ds, dept from T
  where dept=1 and ds is not null;
于 2018-01-11T09:28:36.100 回答