是否可以更改 HIVE 中的分区元数据?

Is it possible to change partition metadata in HIVE?

这是我之前提出的问题的扩展:

我们正在探索更改 table 上的元数据的想法,而不是对 SELECT 语句中的数据执行 CAST 操作。更改 MySQL 元存储中的元数据非常简单。但是,是否可以将元数据更改应用于分区(它们是每天)?否则,我们可能会陷入 BIGINT 类型的当前和未来数据,而历史数据是 STRING。

问:HIVE 中是否可以更改分区元数据?如果是,如何?

您可以使用以下语句更改分区列类型:

alter table {table_name} partition column ({column_name} {column_type});

您还可以重新创建 table 定义并使用以下步骤更改所有列类型:

  1. 将您的 table 设为外部,这样就可以在不删除数据的情况下删除它

    ALTER TABLE abc SET TBLPROPERTIES('EXTERNAL'='TRUE');

  2. 删除 table(仅删除元数据)。

  3. 使用更新的 DDL 创建 EXTERNAL table,类型已更改且位置相同。

  4. 恢复分区:

    MSCK [REPAIR] TABLE tablename;

Amazon Elastic MapReduce (EMR) 版本的 Hive 上的等效命令是:

ALTER TABLE tablename RECOVER PARTITIONS;

这将添加 Hive 分区元数据。请在此处查看手册:RECOVER PARTITIONS

  1. 最后,如有必要,您可以再次 table MANAGED:

ALTER TABLE tablename SET TBLPROPERTIES('EXTERNAL'='FALSE');

Note: All commands above should be ran in HUE, not MySQL.

您不能更改 Hive 中的分区列实际上 Hive 不支持更改分区列

参考:altering partition column type in Hive

你可以这么想 - Hive 通过在具有分区列值的 hdfs 中创建文件夹来存储数据 - 因为如果您尝试更改配置单元分区,则意味着您正在尝试更改配置单元 table 的整个目录结构和数据,这是不可能的 exp 如果你在 year 分区,这就是目录结构的样子

tab1/clientdata/2009/file2
tab1/clientdata/2010/file3

如果要更改分区列,可以执行以下步骤

  1. 创建另一个配置单元 table 并在分区列中进行必要的更改

    创建tablenew_table(A int, B String.....)

  2. 加载之前的数据table

    从 table Prev_table

  3. 插入 new_table 分区 ( B ) select A,B