这是我先前提出的问题的扩展:How to compare two columns with different data type groups
我们正在探索更改表上元数据的想法,而不是对SELECT语句中的数据执行CAST操作。更改MySQL Metastore中的元数据非常容易。但是,是否有可能将元数据更改应用于分区(它们是每天的)?否则,当历史记录为STRING时,我们可能会陷入当前和将来的数据类型为BIGINT的情况。
问题:是否可以在HIVE中更改分区元数据?如果是,怎么办?
答案 0 :(得分:4)
您可以使用以下语句更改分区列的类型:
alter table {table_name} partition column ({column_name} {column_type});
您还可以使用以下步骤重新创建表定义并更改所有列类型:
将表放置在外部,因此可以在不删除数据的情况下将其删除
ALTER TABLE abc SET TBLPROPERTIES('EXTERNAL'='TRUE');
删除表(仅删除元数据)。
恢复分区:
MSCK [REPAIR] TABLE tablename;
Amazon Elastic MapReduce(EMR)版本的Hive上的等效命令为:
ALTER TABLE tablename RECOVER PARTITIONS;
这将添加Hive分区元数据。在此处查看手册:RECOVER PARTITIONS
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
如果要更改分区列,可以执行以下步骤
使用分区列中的所需更改创建另一个配置单元表
创建表new_table(A int,B String .....)
从上一张表中加载数据
插入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
-所以我不确定是否需要它们(但是他们没有固定分区) 。
简单。