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

时间:2019-10-08 22:06:30

标签: sql hadoop hive cloudera hive-metastore

这是我先前提出的问题的扩展:How to compare two columns with different data type groups

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

问题:是否可以在HIVE中更改分区元数据?如果是,怎么办?

3 个答案:

答案 0 :(得分:4)

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

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

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

  1. 将表放置在外部,因此可以在不删除数据的情况下将其删除

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

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

  3. 使用更新的DDL创建EXTERNAL表,该更新的DDL具有更改的类型和相同的位置。
  4. 恢复分区:

    MSCK [REPAIR] TABLE tablename;

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

ALTER TABLE tablename RECOVER PARTITIONS;

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

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

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

  

注意:以上所有命令均应在HUE中运行,而不是MySQL。

答案 1 :(得分:2)

您不能在配置单元中更改分区列实际上配置单元不支持更改分区列

引用:altering partition column type in Hive

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

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

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

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

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

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

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

答案 2 :(得分:2)

更改了Avro(avsc)架构(请参见下文)之后,我可以通过按照此站点执行“添加分区”来“修复”(已存在的)分区:

http://hadooptutorial.info/partitioning-in-hive/

ALTER TABLE partitioned_user ADD PARTITION (country = 'US', state = 'CA')
LOCATION '/hive/external/tables/user/country=us/state=ca'

我通过从MySQL进行更改(更改了MySQL中的字段或SELECT中的CAST())更改了avro模式-这修改了avsc文件。

我在做ADD PARTITION之前已经做过很多事情-我已经做过DROP/CREATE/MSCK TABLE-所以我不确定是否需要它们(但是他们没有固定分区) 。

简单。