配置单元不会更改拼花模式

时间:2016-03-18 13:37:59

标签: hive parquet

我有一个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文件的架构?

3 个答案:

答案 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