我对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文件的架构?
3条答案
按热度按时间wd2eg0qa1#
这里描述了解决方案。如果要将列添加到Parquet地板表并与impala和hive兼容,则需要在末尾添加列。
如果更改表并更改列名或删除列,则该表将不再与impala兼容。
ngynwnxp2#
这不是虫子。当您删除这些列时,这只会更新配置单元元存储中的定义,这只是有关表的信息。hdfs上的底层文件保持不变。因为parquet元数据嵌入到文件中,所以他们不知道元数据发生了什么变化。因此你看到了这个问题。
wz3gfoph3#
在向配置单元表添加列之后,我也遇到了相同的错误。
解决方案是在每个会话中设置以下查询选项
如果您使用的是cloudera发行版,请将其永久设置为
Cloudera Manager
=>Impala configuration
=>Impala Daemon Query Options Advanced Configuration Snippet (Safety Valve)
```set config value as PARQUET_FALLBACK_SCHEMA_RESOLUTION=name