sql—是否可以更改配置单元中的分区元数据?

ogsagwnx  于 2021-05-27  发布在  Hadoop
关注(0)|答案(3)|浏览(401)

这是我之前提出的问题的扩展:如何比较具有不同数据类型组的两列
我们正在探索改变表上元数据的想法,而不是对select语句中的数据执行强制转换操作。在mysql metastore中更改元数据非常简单。但是,是否有可能将元数据更改应用到分区(它们每天都有更改)?否则,当历史数据是字符串时,我们可能会被当前和将来的数据类型为bigint所困扰。
问:是否可以更改配置单元中的分区元数据?如果是,怎么做?

blmhpbnm

blmhpbnm1#

您不能在配置单元中更改分区列,因为配置单元不支持更改分区列
请参阅:更改配置单元中的分区列类型
您可以这样想—hive通过在hdfs中创建一个具有分区列值的文件夹来存储数据—因为如果您尝试更改hive分区,则意味着您尝试更改整个目录结构和hive表的数据,如果您在某一年进行分区,则这是不可能的—这就是目录结构的外观

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

如果要更改分区列,可以执行以下步骤
在分区列中创建另一个具有所需更改的配置单元表
创建新表(a int,b string…..)
从上一个表加载数据
插入到新的表分区(b)从表prev\u table中选择a、b

ecbunoof

ecbunoof2#

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

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

还可以使用以下步骤重新创建表定义并更改所有列类型:
使表成为外部的,这样就可以在不删除数据的情况下删除它 ALTER TABLE SET TBLPROPERTIES('EXTERNAL'='TRUE'); 删除表(只删除元数据)。
使用已更新的ddl创建外部表,类型已更改,位置相同。
恢复分区: MSCK [REPAIR] TABLE tablename; amazon elastic mapreduce(emr)版本的hive上的等效命令是:

ALTER TABLE tablename RECOVER PARTITIONS;

这将添加配置单元分区元数据。请参阅此处的手册:恢复分区
最后,如果需要,可以重新管理表: ALTER TABLE tablename SET TBLPROPERTIES('EXTERNAL'='FALSE'); 注意:上面的所有命令都应该在hue中运行,而不是mysql。

i86rm4rw

i86rm4rw3#

在我更改了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执行sqoop更改了avro模式(在mysql中更改字段或 CAST() 在“选择”对话框中,这修改了avsc文件。
在做这件事之前,我做了很多事情 ADD PARTITION -我已经做了 DROP/CREATE/MSCK TABLE -所以我不确定是否需要它们(但是它们没有修复分区)。
很简单。

相关问题