我在一个基于Parquet的Hive表中有很多数据(Hive version 0.10)。我必须在表中添加几个新列。我希望新的列有数据向前推进。对于已经加载的数据,如果该值为NULL,这对我来说是可以的。
如果我添加新列而不更新旧的Parquet文件,就会产生一个错误,而且它看起来很奇怪,因为我只添加了字符串列。
错误获取带异常java.lang.UnsupportedOperationException的行数据:无法检查java.util.ArrayList
您能告诉我如何在不影响表中现有数据的情况下向Parquet Hive添加新字段吗?
我使用的是Hive版本0.10。
谢谢。
发布于 2016-04-25 00:10:00
( 1)从0.13版本开始的蜂巢中内置了拼花模式调用。
https://issues.apache.org/jira/browse/HIVE-6456
https://github.com/Parquet/parquet-mr/pull/297
ps。请注意,对模式演化的开箱即用的支持可能会影响性能。例如,星火有一个旋钮来打开和关闭拼花模式的演变。在最近的一次星火发布之后,由于性能受到影响,它现在默认关闭了(当有大量的拼花文件时)。不确定Hive 0.13+是否也有这样的设置。
2)还想建议尝试在Hive中创建视图,在这些表之上,您可以期望经常更改模式,并在任何地方都使用视图,而不是直接使用表。
例如,如果您有两个具有兼容模式的表A和B,但表B又有两个列,则可以通过
CREATE VIEW view_1 AS
SELECT col1,col2,col3,null as col4,null as col5 FROM tableA
UNION ALL
SELECT col1,col2,col3,col4,col5 FROM tableB
;因此,您不必像@miljanm所建议的那样重新创建任何表,只需重新创建视图即可。它将有助于提高项目的灵活性。
发布于 2015-01-21 10:38:14
使用两个新列创建一个新表。通过发出以下命令插入数据:
insert into new_table select old_table.col1, old_table.col2,...,null,null from old_table;最后两个空列用于这两个新列。就这样。
如果列太多,则编写一个读取旧文件和写入新文件的程序可能更容易。
据我所知,Hive 0.10不支持在拼花中进行模式进化。蜂窝0.13确实有,所以你可以尝试升级蜂箱。
https://stackoverflow.com/questions/27868745
复制相似问题