hive 不会改变 parquet 模式
Posted
技术标签:
【中文标题】hive 不会改变 parquet 模式【英文标题】:hive doesn't change parquet schema 【发布时间】:2016-03-18 13:37:59 【问题描述】:我的 alter table 有问题,它改变了表架构,但没有改变 parquet 架构。
例如,我有一个包含这些列的 PARQUET
表:
column1(string) column2(string)
column3(string) column4(string)
column5(bigint)
现在,我尝试使用
更改表的架构ALTER TABLE name_table DROP COLUMN column3;
使用 DESCRIBE TABLE 我可以看到 column2 不再存在;
现在我尝试执行select * from table
,但收到如下错误:
“data.0.parq' 的类型与列 column4 的表架构不兼容。预期类型:INT64。实际类型:BYTE_ARRAY”
已删除列的值尚未出现在有 5 列而不是 4 列的镶木地板文件中(作为表模式)
这是一个错误?如何使用 Hive 更改 Parquet 文件的架构?
【问题讨论】:
您确定您使用的是 hive 而不是 impala 吗? 【参考方案1】:这不是错误。当您删除列时,只会更新 Hive Metastore 中的定义,这只是有关表的信息。 HDFS 上的底层文件保持不变。由于 parquet 元数据嵌入在文件中,因此他们不知道元数据发生了什么变化。 因此你会看到这个问题。
【讨论】:
你只是再次描述问题,没有提供解决方案 我不是。问题是“这是一个错误?如何使用 Hive 更改 Parquet 文件的架构?”。我回答说这不是错误。这是设计使然,从逻辑上讲,没有“解决方案”。“更改”文件中元数据的唯一方法是创建新文件。 确实有办法改变 parquet 模式。请参阅我的回复中的链接页面。【参考方案2】:解决方案描述为here。如果您想在 parquet 表中添加一列并与 impala 和 hive 兼容,则需要在末尾添加列。
如果您更改表并更改列名或删除列,则该表将不再与 impala 兼容。
【讨论】:
【参考方案3】:向 hive 表添加列后,我遇到了同样的错误。
解决方案是在每个会话中设置以下查询选项
set PARQUET_FALLBACK_SCHEMA_RESOLUTION=name;
如果您使用 Cloudera 发行版,请将其永久设置为 Cloudera Manager
=> Impala configuration
=> Impala Daemon Query Options Advanced Configuration Snippet (Safety Valve)
set config value as PARQUET_FALLBACK_SCHEMA_RESOLUTION=name
【讨论】:
以上是关于hive 不会改变 parquet 模式的主要内容,如果未能解决你的问题,请参考以下文章
hudi使用cow生成parquet格式用hive查询的问题