在Hive中使用CASCADE的ADD COLUMN的确切行为

时间:2017-12-13 16:50:25

标签: hive alter

假设下一个表:

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

a,b和c是整数,表由c分区。 当我使用CASCADE在Hive中添加一列时:

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)。但是,如果我添加没有CASCADE的列:

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

也就是说,两个插入的列都是NULL。

我不太清楚在使用CASCADE或RESTRICT添加列之间的区别,在Hive文档中我可以看到:

  

可以在Hive 1.1.0中使用CASCADE | RESTRICT子句。更改表   使用CASCADE命令添加| REPLACE COLUMNS会更改a的列   表格的元数据,并将相同的更改级联到所有分区   元数据。 RESTRICT是默认值,限制列仅更改为   表元数据。

但我并不清楚"对所有分区元数据进行相同的更改" "限制列更改仅限于表格元数据" 。 (Restrict是否仅适用于一个分区,Cascade适用于所有分区?前面的示例说明相反)。如果这就是插入第一列(在CASCADE模式下)获取分区列值的原因。

1 个答案:

答案 0 :(得分:-1)

如果我们不在ADD列中添加层叠,则现有分区将具有相同的定义。即使在用新字段覆盖分区之后,该新列在它们中也将为空。 您可以删除并重新创建分区以解决此问题。