如何从impala中的表中删除列

Posted

技术标签:

【中文标题】如何从impala中的表中删除列【英文标题】:how to drop columns from a table in impala 【发布时间】:2019-07-19 21:59:48 【问题描述】:

我有一个超过 2000 列的表,但我只需要删除一列 有什么有效的方法可以在 impala 中制作它?

我正在尝试这种方式:

alter table proceso.prueba drop subsegm
select * from proceso.prueba

但是,我在“选择”中遇到了这个错误:

 'hdfs://nameservice1/user/hive/warehouse/proceso.db/prueba/914a7dd4a8462ff1- 
860a4c1d00000011_978927331_data.1.parq' has an incompatible Parquet schema 
for column 'proceso.prueba.nfi_meses_antiguedad_bco'. Column type: INT, 
Parquet schema: optional byte_array subsegm [i:4 d:1 r:0]

我做错了什么?

感谢您的帮助

【问题讨论】:

【参考方案1】:

当为表定义的架构(在这种情况下为列的数据类型)与表的相应 Parquet 文件中存在的架构冲突时,会发生此错误。

要解决此问题,您可以检查以下内容,

    执行SHOW CREATE TABLE proceso.prueba 并列出列。 运行命令parquet-tools meta hdfs://nameservice1/user/hive/warehouse/proceso.db/prueba/914a7dd4a8462ff1- 860a4c1d00000011_978927331_data.1.parq 以查看包含列详细信息的元数据。 比较 #1、#2 的结果以查看列数是否正确,并查看列 subsegm(在 #2 结果中)的数据类型是否与它应该具有的(在 # 1 个结果)。 将表数据类型修改为正确的值、结构(如果需要)应该可以帮助您解决此问题。

希望有帮助!

【讨论】:

第二条指令不运行! 您可能需要下载 parquet-tools 才能运行该命令。即使您有 parquet-tools jar,您是否也面临任何错误? 但假设我们需要修改数据类型。我该怎么做? @JuanDavid 。您可以从这里下载 parquet-tools。您也可以在那里阅读以了解它。链接:github.com/apache/parquet-mr/tree/master/parquet-tools 要修改数据类型 - 您需要在 Impala 中运行 ATLER TABLE 语句。 ALTER TABLE table_name CHANGE column_name new_name new_type; 旁注:更改 Parquet 文件中的数据类型并不容易。需要使用新数据类型从源重新生成整个文件。因此,在 Metastore 级别更改数据类型是一个很好的解决方法。

以上是关于如何从impala中的表中删除列的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Impala 中显示复杂数据列(地图类型)中的所有字段?

创建行满足条件的 Impala 文本表

从 impala 更新 vertica 中的巨大记录

使用 Impala 在 Bash 数组中获取 HBase 列

如何查看 impala 表中的分区数

如何将数据从 CSV 加载到 impala 的外部表中