如何更改配置单元分区列名

wr98u20j  于 2021-06-03  发布在  Hadoop
关注(0)|答案(5)|浏览(307)

我必须更改分区列名(不是分区规范),我在hivewiki和一些google页面中查找命令。我可以找到改变分区规格的方法,
i、 例如
在/table/country='us'中,我可以把我们换成美国,但我想把国家换成大陆。
我觉得更改分区列名的唯一选择是删除并重新创建表。有其他选择吗?请帮助我。
提前谢谢。

6fe3ivhb

6fe3ivhb1#

在此处添加解决方案供以后使用:
用例:将分区列从string更改为int

set hive.mapred.mode=norestrict; 
alter table {table_name} partition column ({column_name} {column_type}); 

e.g. ALTER TABLE employee PARTITION COLUMN dept INT;
kyvafyod

kyvafyod2#

您已经使用简单交换方法更改了分区列。
创建一个与当前表相同架构的新临时表。
将旧表中的所有文件移到新创建表的位置。 hadoop fs -mv <current_table_name> <temp_table_name> 更改原始表的架构(重命名或删除分区)
使用适当的分区值将临时表数据重新复制/加载到原始表。 hadoop fs -mv <temp_table_name> <current_table_name> msck修复原始表并删除temp\u表。
注意:mv命令可以将文件从一个位置移动到另一个位置,从而减少复制时间。或者我们可以使用 LOAD DATA INPATH 例如,将数据复制到原始表。

az31mfrm

az31mfrm3#

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

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

如果要更改分区列,可以执行以下步骤
在分区列中创建另一个具有所需更改的配置单元表

Create table new_table ( A int, B String.....)

从上一个表加载数据

Insert into new_table partition ( B ) select A,B from table Prev_table
kqlmhetl

kqlmhetl4#

正如您所说,重命名分区的值非常简单:

hive> ALTER TABLE test.usage PARTITION (country ='US') RENAME TO PARTITION (date='USA');

我知道这不是你要找的。不幸的是,考虑到您的数据已经按国家/地区进行了分区,您唯一的选择就是删除表,从hdfs中删除数据(假设您的表是外部的),然后使用大陆作为分区重新插入数据。
在您的情况下,我将使用多个分区级别,这样您的文件夹结构将如下所示:

/path/to/the/data/continent='america'/country='usa'
/path/to/the/data/continent='america'/country='mexico'
/path/to/the/data/continent='europe'/country='spain'
/path/to/the/data/continent='europe'/country='italy'
...

这样,您就可以查询不同粒度级别的数据(在本例中为大陆和国家)。

zaq34kh6

zaq34kh65#

可以通过以下方式更改元数据中的列名:https://cwiki.apache.org/confluence/display/hive/languagemanual+ddl#languagemanualddl-更改列名称/类型/位置/注解
但正如文件所说,它只改变了元数据。配置单元分区被实现为具有命名模式columnname=spec的目录,因此您还需要使用“hadoop fs”命令更改hdfs上那些目录的名称。

相关问题