1

我正在使用 Hive 的动态分区,并且我遇到了一个问题,即除非添加新分区,否则一列没有填充数据。我创建了一个小的演示示例来演示。

1.创建表蔬菜(name string,count bigint)按(year int,month int,day int)分区;
2.创建外部表dataForVeg(name string, count bigint, weight string, year int, month int, day int) 行格式分隔字段,以' '结尾;
3.将data1加载到dataforveg
4. 设置 hive.exec.dynamic.partition.mode=nonstrict;
5.插入表蔬菜分区(年,月,日)从dataforveg中选择名称,计数,年,月,日;

6. hive> select * from vegetables where day='5';
番茄 5 2013 11 5
卷心菜 3 2013 11 5

7.蜂巢>改变餐桌蔬菜添加列(重量加倍);
8.蜂巢>描述蔬菜;
名称字符串
计算大整数
重量翻倍
年份
月份整数
日整数

9. hive> select * from vegetables where day='5';
番茄 5 NULL 2013 11 5
卷心菜 3 NULL 2013 11 5

蜂巢> 从蔬菜中选择 * 其中 day='4';
马铃薯 2 NULL 2013 11 4

10.加载覆盖data2到dataforveg
11. hive>从dataforveg中选择*;
胡萝卜 10 5 2013 11 5
胡椒 15 2 2013 11 5

12. hive> select * from vegetables where day='5';
番茄 5 NULL 2013 11 5
卷心菜 3 NULL 2013 11 5
胡萝卜 10 NULL 2013 11 5
胡椒 15 NULL 2013 11 5

13.将覆盖data3加载到dataforveg
蜂巢>从dataforveg中选择*;
甜菜 4 1 2013 11 6
西兰花 3 1 2013 11 6

14.蜂巢>从蔬菜中选择*;
马铃薯 2 NULL 2013 11 4
番茄 5 NULL 2013 11 5
卷心菜 3 NULL 2013 11 5
胡萝卜 10 NULL 2013 11 5
胡椒 15 NULL 2013 11 5
甜菜 4 1.0 2013 11 6
西兰花 3 1.0 2013 11 6

从示例中可以看出,添加新分区时正在更新数据。问题:有没有办法在第 12 步中刷新胡萝卜和胡椒的新字段“重量”的值?换句话说,有没有办法用已经存在的分区中的数据填充新添加的列?

4

1 回答 1

1

底层文件系统 HDFS 不支持更新甚至追加文件。在这种情况下,您唯一的选择是创建一个 MapReduce 作业,它将旧分区中的数据与新列的值合并,然后用该 MapReduce 作业的输出替换该分区中的文件。

如果您不喜欢编写 MapReduce 作业,您可能可以结合 Hive CTAS(创建表作为选择)和 HDFS 操作来装配一些东西。

于 2013-11-06T18:54:55.483 回答