假设下一个表:
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模式下)获取分区列值的原因。
答案 0 :(得分:-1)
如果我们不在ADD列中添加层叠,则现有分区将具有相同的定义。即使在用新字段覆盖分区之后,该新列在它们中也将为空。 您可以删除并重新创建分区以解决此问题。