我在基于 Parquet 的 Hive 表(Hive 版本 0.10)中有很多数据。我必须向表中添加一些新列。我希望新列有数据前进。如果已加载数据的值为 NULL,那对我来说没问题。
如果我添加新列而不更新旧的 Parquet 文件,则会出现错误并且看起来很奇怪,因为我只添加了字符串列。
获取行数据时出错,异常 java.lang.UnsupportedOperationException:无法检查 java.util.ArrayList
你能告诉我如何在不影响表中现有数据的情况下向 Parquet Hive 添加新字段吗?
我使用 Hive 0.10 版。
谢谢。
1) Hive 从 0.13 版本开始内置了 parquet schema evoultion。
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
;
Run Code Online (Sandbox Code Playgroud)
因此,您实际上不必像 @miljanm 建议的那样重新创建任何表,您只需重新创建视图即可。它将有助于提高项目的敏捷性。
创建一个包含两个新列的新表。通过发出以下命令插入数据:
insert into new_table select old_table.col1, old_table.col2,...,null,null from old_table;
Run Code Online (Sandbox Code Playgroud)
最后两个空值用于两个新列。就是这样。
如果您有太多列,那么编写一个读取旧文件并写入新文件的程序可能会更容易。
据我所知,Hive 0.10 不支持 parquet 中的模式演化。Hive 0.13 已经有了,所以你可以尝试升级 hive。
| 归档时间: |
|
| 查看次数: |
5439 次 |
| 最近记录: |