我有一个alter table的问题,它改变了表模式而不是镶木地板模式。
例如,我有一个PARQUET
表,其中包含以下列:
column1(string) column2(string)
column3(string) column4(string)
column5(bigint)
现在,我尝试使用
更改表的架构ALTER TABLE name_table DROP COLUMN column3;
使用DESCRIBE TABLE我可以看到第二列不再存在;
现在我尝试执行select * from table
但我收到如下错误:
“data.0.parq”与列column4的表架构具有不兼容的类型。预期类型:INT64。实际类型:BYTE_ARRAY“
已删除列的值仍存在于具有5列而非4列(作为表架构)的镶木地板文件中
这是一个错误吗?如何使用Hive更改Parquet文件的架构?
答案 0 :(得分:2)
这不是错误。删除列时,只会更新Hive Metastore中的定义,这只是有关表的信息。 HDFS上的基础文件保持不变。由于镶木地板元数据嵌入在文件中,因此他们不知道元数据的变化是什么。 因此,你看到了这个问题。
答案 1 :(得分:1)
解决方案描述为here。如果要将一个列添加到镶木桌并与impala和hive兼容,则需要在末尾添加列。
如果您更改表并更改列名或删除列,该表将不再与impala兼容。
答案 2 :(得分:0)
将列添加到配置单元表后,我遇到了相同的错误。
解决方案是在每个会话中设置以下查询选项
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