配置单元不会更改镶木地板架构

hive doesn't change parquet schema

我在使用 alter table 时遇到问题,它会更改 table 架构但不会更改 parquet 架构。

例如,我有一个 PARQUET table 包含这些列:

column1(string)    column2(string) 
column3(string)    column4(string)
column5(bigint)

现在,我尝试用

更改 table 的架构
ALTER TABLE name_table DROP COLUMN column3; 

使用 DESCRIBE TABLE 我可以看到 column2 已经不存在了;

现在我尝试执行 select * from table 但我收到这样的错误:

"data.0.parq' has an incompatible type with the table schema for column column4. Expected type: INT64. Actual type: BYTE_ARRAY"

已删除列的值仍存在于具有 5 列而不是 4 列的镶木地板文件中(作为 table 模式)

这是一个错误?如何使用 Hive 更改 Parquet 文件的架构?

这不是错误。当您删除列时,只会更新 Hive Metastore 中的定义,这只是关于 table 的信息。 HDFS 上的底层文件保持不变。由于 parquet 元数据嵌入在文件中,他们不知道元数据发生了什么变化。 因此你看到了这个问题。

描述了解决方案here。如果要将列添加到镶木地板 table 并与 impala 和配置单元兼容,则需要在末尾添加列。

如果您更改 table 并更改列名或删除列,则 table 将不再与 impala 兼容。

我在向配置单元添加列后遇到了同样的错误 table。

解决方案是在每个会话中设置以下查询选项

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