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 模式的主要内容,如果未能解决你的问题,请参考以下文章

Pyspark--调用 o50.parque 时出错

Sqooping 数据后 Hive 抛出错误

hudi使用cow生成parquet格式用hive查询的问题

数据存储在对象存储中时从 Spark SQL 访问 Hive 表

Hive中Parquet格式的使用

Parquet模式写入分区错误修改