3

这是我之前提出的问题的扩展:如何比较具有不同数据类型组的两列

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

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

4

2 回答 2

4

You can change partition column type using this statement:

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

Also you can re-create table definition and change all columns types using these steps:

  1. Make your table external, so it can be dropped without dropping the data

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

  2. Drop table (only metadata will be removed).

  3. Create EXTERNAL table using updated DDL with types changed and with the same LOCATION.

  4. recover partitions:

    MSCK [REPAIR] TABLE tablename;

The equivalent command on Amazon Elastic MapReduce (EMR)'s version of Hive is:

ALTER TABLE tablename RECOVER PARTITIONS;

This will add Hive partitions metadata. See manual here: RECOVER PARTITIONS

  1. And finally you can make you table MANAGED again if necessary:

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

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

于 2019-10-09T07:27:23.107 回答
2

您不能更改 hive 中的分区列,事实上 Hive 不支持更改分区列

参考:更改 Hive 中的分区列类型

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

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

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

  1. 在分区列中创建另一个具有所需更改的配置单元表

    创建表 new_table ( A int, B String .....)

  2. 从上一个表中加载数据

    插入 new_table 分区 ( B ) 从表 Prev_table 中选择 A,B

于 2019-10-09T09:16:48.850 回答