5

我在基于 Parquet 的 Hive 表(Hive 版本 0.10)中有很多数据。我必须在表中添加一些新列。我希望新列有数据。如果已经加载的数据的值为 NULL,那对我来说很好。

如果我添加新列而不更新旧 Parquet 文件,则会出现错误并且看起来很奇怪,因为我只添加了String列。

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

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

我使用 Hive 0.10 版。

谢谢。

4

2 回答 2

4

1) 从 0.13 版开始的 Hive 内置了 parquet 模式进化。

https://issues.apache.org/jira/browse/HIVE-6456

https://github.com/Parquet/parquet-mr/pull/297

附言。请注意,对模式演变的开箱即用支持可能会影响性能。例如,Spark 有一个旋钮可以打开和关闭 parquet 模式演变。在最近的 Spark 版本之一之后,由于性能下降,它现在默认关闭(尤其是当有很多 parquet 文件时)。不确定 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 建议的那样重新创建任何表,您只需重新创建视图即可。它将有助于您的项目的敏捷性。

于 2016-04-25T00:10:00.483 回答
2

使用两个新列创建一个新表。通过发出插入数据:

insert into new_table select old_table.col1, old_table.col2,...,null,null from old_table;

最后两个空值用于两个新列。而已。

如果列太多,编写一个读取旧文件并写入新文件的程序可能会更容易。

据我所知,Hive 0.10 不支持镶木地板中的模式演变。Hive 0.13 确实有它,所以你可以尝试升级 hive。

于 2015-01-21T10:38:14.603 回答