Hive不会改变Parquet模式

sshcrbum  于 2021-06-26  发布在  Hive
关注(0)|答案(3)|浏览(355)

我对altertable有一个问题,它改变了表模式,但没有改变parquet模式。
例如我有一个 PARQUET 包含以下列的表:

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

现在,我尝试用

ALTER TABLE name_table DROP COLUMN column3;

通过描述表,我可以看到第2列已经不存在了;
现在我试着去执行 select * from table 但我收到这样一个错误:
“data.0.parq”的类型与列column4的表架构不兼容。应为类型:int64。实际类型:字节数组“
已删除列的值仍存在于具有5列而不是4列的parquet文件中(如表架构所示)
这是虫子?如何使用配置单元更改Parquet文件的架构?

wd2eg0qa

wd2eg0qa1#

这里描述了解决方案。如果要将列添加到Parquet地板表并与impala和hive兼容,则需要在末尾添加列。
如果更改表并更改列名或删除列,则该表将不再与impala兼容。

ngynwnxp

ngynwnxp2#

这不是虫子。当您删除这些列时,这只会更新配置单元元存储中的定义,这只是有关表的信息。hdfs上的底层文件保持不变。因为parquet元数据嵌入到文件中,所以他们不知道元数据发生了什么变化。因此你看到了这个问题。

wz3gfoph

wz3gfoph3#

在向配置单元表添加列之后,我也遇到了相同的错误。
解决方案是在每个会话中设置以下查询选项

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

相关问题