这是我之前提出的问题的扩展:如何比较具有不同数据类型组的两列我们正在探索改变表上元数据的想法,而不是对select语句中的数据执行强制转换操作。在mysql metastore中更改元数据非常简单。但是,是否有可能将元数据更改应用到分区(它们每天都有更改)?否则,当历史数据是字符串时,我们可能会被当前和将来的数据类型为bigint所困扰。问:是否可以更改配置单元中的分区元数据?如果是,怎么做?
blmhpbnm1#
您不能在配置单元中更改分区列,因为配置单元不支持更改分区列请参阅:更改配置单元中的分区列类型您可以这样想—hive通过在hdfs中创建一个具有分区列值的文件夹来存储数据—因为如果您尝试更改hive分区,则意味着您尝试更改整个目录结构和hive表的数据,如果您在某一年进行分区,则这是不可能的—这就是目录结构的外观
tab1/clientdata/2009/file2 tab1/clientdata/2010/file3
如果要更改分区列,可以执行以下步骤在分区列中创建另一个具有所需更改的配置单元表创建新表(a int,b string…..)从上一个表加载数据插入到新的表分区(b)从表prev\u table中选择a、b
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 SET TBLPROPERTIES('EXTERNAL'='TRUE');
MSCK [REPAIR] TABLE tablename;
ALTER TABLE tablename RECOVER PARTITIONS;
这将添加配置单元分区元数据。请参阅此处的手册:恢复分区最后,如果需要,可以重新管理表: ALTER TABLE tablename SET TBLPROPERTIES('EXTERNAL'='FALSE'); 注意:上面的所有命令都应该在hue中运行,而不是mysql。
ALTER TABLE tablename SET TBLPROPERTIES('EXTERNAL'='FALSE');
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 -所以我不确定是否需要它们(但是它们没有修复分区)。很简单。
CAST()
ADD PARTITION
DROP/CREATE/MSCK TABLE
3条答案
按热度按时间blmhpbnm1#
您不能在配置单元中更改分区列,因为配置单元不支持更改分区列
请参阅:更改配置单元中的分区列类型
您可以这样想—hive通过在hdfs中创建一个具有分区列值的文件夹来存储数据—因为如果您尝试更改hive分区,则意味着您尝试更改整个目录结构和hive表的数据,如果您在某一年进行分区,则这是不可能的—这就是目录结构的外观
如果要更改分区列,可以执行以下步骤
在分区列中创建另一个具有所需更改的配置单元表
创建新表(a int,b string…..)
从上一个表加载数据
插入到新的表分区(b)从表prev\u table中选择a、b
ecbunoof2#
可以使用以下语句更改分区列类型:
还可以使用以下步骤重新创建表定义并更改所有列类型:
使表成为外部的,这样就可以在不删除数据的情况下删除它
ALTER TABLE SET TBLPROPERTIES('EXTERNAL'='TRUE');
删除表(只删除元数据)。使用已更新的ddl创建外部表,类型已更改,位置相同。
恢复分区:
MSCK [REPAIR] TABLE tablename;
amazon elastic mapreduce(emr)版本的hive上的等效命令是:这将添加配置单元分区元数据。请参阅此处的手册:恢复分区
最后,如果需要,可以重新管理表:
ALTER TABLE tablename SET TBLPROPERTIES('EXTERNAL'='FALSE');
注意:上面的所有命令都应该在hue中运行,而不是mysql。i86rm4rw3#
在我更改了avro(avsc)模式(见下文)之后,我能够通过按照以下站点执行“添加分区”来“修复”这个(已经存在的)分区:
http://hadooptutorial.info/partitioning-in-hive/
我通过从mysql执行sqoop更改了avro模式(在mysql中更改字段或
CAST()
在“选择”对话框中,这修改了avsc文件。在做这件事之前,我做了很多事情
ADD PARTITION
-我已经做了DROP/CREATE/MSCK TABLE
-所以我不确定是否需要它们(但是它们没有修复分区)。很简单。