我在基于Parquet的Hive表(Hive版本0.10)中有很多数据。我必须在表格中添加一些新列。我希望新列能够继续提供数据。如果已经加载的数据的值为NULL,那对我来说没问题。
如果我添加新列而不更新旧的Parquet文件,则会出错,因为我只添加 String 列,所以看起来很奇怪。
使用异常java.lang.UnsupportedOperationException获取行数据时出错:无法检查java.util.ArrayList
您能告诉我如何在不影响表格中现有数据的情况下向Parquet Hive添加新字段吗?
我使用的是Hive版本0.10。
感谢。
答案 0 :(得分:3)
1) 从版本0.13开始的Hive内置了镶木地板模式evoultion。
https://issues.apache.org/jira/browse/HIVE-6456
https://github.com/Parquet/parquet-mr/pull/297
PS。请注意,对模式演变的开箱即用支持可能会对性能产生影响。例如,Spark有一个旋钮可以打开和关闭镶木地板模式。在最近的一个Spark发布之后,由于性能受到影响(默认情况下有大量的镶木地板文件),它现在默认关闭。不确定Hive 0.13+是否也有这样的设置。
2) 还想建议尝试在Hive上创建视图,在这样的镶木桌上,您希望经常进行模式更改,并且在任何地方使用视图而不是直接使用表。
例如,如果您有两个表 - A和B具有兼容的模式,但表B有两个列,您可以通过
解决此问题square = num * num;
printf("Square of %d is: %d\n", num, square);
if (fact < square)
printf("Gotcha!\n");
因此,您实际上不必重新创建@miljanm建议的任何表,您只需重新创建视图即可。它有助于提高项目的灵活性。
答案 1 :(得分:2)
使用两个新列创建一个新表。通过发出以下内容插入数据:
insert into new_table select old_table.col1, old_table.col2,...,null,null from old_table;
最后两个空值用于两个新列。就是这样。
如果列太多,可能更容易编写一个读取旧文件并编写新文件的程序。
据我所知,Hive 0.10在镶木地板中不支持模式演变。 Hive 0.13确实拥有它,因此您可以尝试升级配置单元。