Parquet Hive表中的模式演变

时间:2015-01-09 20:31:26

标签: hive parquet

我在基于Parquet的Hive表(Hive版本0.10)中有很多数据。我必须在表格中添加一些新列。我希望新列能够继续提供数据。如果已经加载的数据的值为NULL,那对我来说没问题。

如果我添加新列而不更新旧的Parquet文件,则会出错,因为我只添加 String 列,所以看起来很奇怪。

  

使用异常java.lang.UnsupportedOperationException获取行数据时出错:无法检查java.util.ArrayList

您能告诉我如何在不影响表格中现有数据的情况下向Parquet Hive添加新字段吗?

我使用的是Hive版本0.10。

感谢。

2 个答案:

答案 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确实拥有它,因此您可以尝试升级配置单元。