有没有办法用已经存在的分区中的数据填充新添加的列?

Posted

技术标签:

【中文标题】有没有办法用已经存在的分区中的数据填充新添加的列?【英文标题】:Is there a way to fill the newly added columns with data in an already existing partition? 【发布时间】:2013-11-06 11:45:22 【问题描述】:

我正在使用 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 步中刷新胡萝卜和胡椒的新字段“重量”的值? 换句话说,

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

感谢回复,我会试试的。

以上是关于有没有办法用已经存在的分区中的数据填充新添加的列?的主要内容,如果未能解决你的问题,请参考以下文章

如何将具有值的列添加到 Spark Java 中的新数据集?

Hive分区表动态添加字段

仅显示从 ExtJS 3.x 中的外部 JSON 填充的列

使用 ALTER 添加新列后,数据错误地加载到 Hive 分区表中

有没有办法通过 CSS 为选择选项添加填充?

使用 spark 用下一行值填充 null 或空