exact行为

k0pti3hp  于 2021-06-26  发布在  Hive
关注(0)|答案(1)|浏览(364)

假设下一个表:

sch_test.test_cascade
    a    b    c
    -----------
    6    10   1
    6    10   1
    6    10   2
    6    10   2

a、 b和c是整数,表由c划分。当我在带有cascade的配置单元中添加列时:

ALTER TABLE sch_test.test_cascade ADD COLUMNS (d int, e int) CASCADE;

它返回下一个表:

sch_test.test_cascade
a    b    d    e     c
-------------------------
6    10   1    NULL  1    
6    10   1    NULL  1  
6    10   2    NULL  2  
6    10   2    NULL  2

也就是说,第一个插入的列(在本例中是d)采用分区列的值(注意,我添加了两列以显示第二列为null)。但是,如果我添加一个没有层叠的列:

ALTER TABLE sch_test.test_cascade ADD COLUMNS (d int, e int);

它返回下一个表:

sch_test.test_cascade
a    b    d       e      c
----------------------------
6    10   NULL    NULL   1
6    10   NULL    NULL   1
6    10   NULL    NULL   2
6    10   NULL    NULL   2

也就是说,两个插入的列都是空的。
我不太明白在配置单元文档中,添加带有层叠或限制的列之间的区别:
cascade | restrict子句在hive1.1.0中可用。alter table add | replace columns with cascade命令更改表元数据的列,并将相同的更改级联到所有分区元数据。restrict是默认值,仅将列更改限制为表元数据。
但我不清楚“将相同的更改级联到所有分区元数据”和“仅将列更改限制到表元数据”之间的区别(限制是否只应用于一个分区并级联到所有分区?上一个例子正好相反)。如果这就是为什么插入的第一列(在级联模式下)取分区列的值的原因。

vjhs03f7

vjhs03f71#

如果在add column期间不添加cascade,现有分区将具有相同的定义。即使在用新字段覆盖分区之后,这个新列在它们中也是空的。您可以删除并重新创建分区来修复此问题。

相关问题