Hive 配置单元中带级联的ADD列的精确行为

Hive 配置单元中带级联的ADD列的精确行为,hive,alter,Hive,Alter,假设下一个表: sch_test.test_cascade a b c ----------- 6 10 1 6 10 1 6 10 2 6 10 2 sch_test.test_cascade a b d e c ------------------------- 6 10 1 NULL 1 6 10 1 NULL 1

假设下一个表:

sch_test.test_cascade
    a    b    c
    -----------
    6    10   1
    6    10   1
    6    10   2
    6    10   2
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
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
a、 b和c是整数,表由c分区。 当我在带有级联的配置单元中添加列时:

ALTER TABLE sch_test.test_cascade ADD COLUMNS (d int, e int) CASCADE;
它返回下一个表:

sch_test.test_cascade
    a    b    c
    -----------
    6    10   1
    6    10   1
    6    10   2
    6    10   2
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
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
也就是说,第一个插入的列(在本例中为d)接受分区列的值(注意,我添加了两列以显示第二列为NULL)。但是,如果我添加一个没有级联的列:

ALTER TABLE sch_test.test_cascade ADD COLUMNS (d int, e int);
它返回下一个表:

sch_test.test_cascade
    a    b    c
    -----------
    6    10   1
    6    10   1
    6    10   2
    6    10   2
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
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

我不太明白在配置单元文档中,添加带有级联或限制的列之间的区别:

级联|限制子句在Hive 1.1.0中可用。更改表格 添加|用级联替换列命令更改 表的元数据,并将相同的更改级联到所有分区 元数据。“限制”是默认设置,限制列仅更改为 表元数据


但我不清楚“将相同的更改级联到所有分区元数据”和“仅将列更改限制到表元数据”之间的区别。(限制是否只适用于一个分区,而级联到所有分区?上一个示例说明了相反的情况)。如果这就是插入的第一列(在级联模式下)获取分区列值的原因。

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

不使用
CASCADE
ALTER
仅适用于默认定义,即将用于新分区的定义,而不适用于现有分区。基本原理是,您已经在旧分区中使用了旧格式的旧数据文件。关于您的测试用例,分区键也被“神奇地”用作下一个实际列,嗯,嗯,我只能猜测。您确定数据文件中没有额外的列,因为您的配置单元定义只映射了前2列而被隐藏吗??你能跟踪其中一个文件吗?谢谢你的回答。我非常确定,因为我是手工编写文件的,所以我认为有额外列的假设不适用,这仍然是一个谜!尽管如此,您对
CASCADE
ALTER
的解释还是有意义的,因为只有
CASCADE
更改了旧分区的de值(但方式很奇怪)。如果不添加CASCADE,则无法加载(历史或回填)那些已经存在的分区中的列。当我使用CASCADE时,我没有体验到这种奇怪的行为。