我必须更改分区列名(不是分区规范),我在hivewiki和一些google页面中查找命令。我可以找到改变分区规格的方法,i、 例如在/table/country='us'中,我可以把我们换成美国,但我想把国家换成大陆。我觉得更改分区列名的唯一选择是删除并重新创建表。有其他选择吗?请帮助我。提前谢谢。
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;
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 例如,将数据复制到原始表。
hadoop fs -mv <current_table_name> <temp_table_name>
hadoop fs -mv <temp_table_name> <current_table_name>
LOAD DATA INPATH
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
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' ...
这样,您就可以查询不同粒度级别的数据(在本例中为大陆和国家)。
zaq34kh65#
可以通过以下方式更改元数据中的列名:https://cwiki.apache.org/confluence/display/hive/languagemanual+ddl#languagemanualddl-更改列名称/类型/位置/注解但正如文件所说,它只改变了元数据。配置单元分区被实现为具有命名模式columnname=spec的目录,因此您还需要使用“hadoop fs”命令更改hdfs上那些目录的名称。
5条答案
按热度按时间6fe3ivhb1#
在此处添加解决方案供以后使用:
用例:将分区列从string更改为int
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
例如,将数据复制到原始表。az31mfrm3#
您不能在配置单元中更改分区列,因为配置单元不支持更改分区列
您可以这样想—hive通过在hdfs中创建一个具有分区列值的文件夹来存储数据—因为如果您尝试更改hive分区,则意味着您尝试更改整个目录结构和hive表的数据,如果您在某一年进行分区,则这是不可能的—这就是目录结构的外观
如果要更改分区列,可以执行以下步骤
在分区列中创建另一个具有所需更改的配置单元表
从上一个表加载数据
kqlmhetl4#
正如您所说,重命名分区的值非常简单:
我知道这不是你要找的。不幸的是,考虑到您的数据已经按国家/地区进行了分区,您唯一的选择就是删除表,从hdfs中删除数据(假设您的表是外部的),然后使用大陆作为分区重新插入数据。
在您的情况下,我将使用多个分区级别,这样您的文件夹结构将如下所示:
这样,您就可以查询不同粒度级别的数据(在本例中为大陆和国家)。
zaq34kh65#
可以通过以下方式更改元数据中的列名:https://cwiki.apache.org/confluence/display/hive/languagemanual+ddl#languagemanualddl-更改列名称/类型/位置/注解
但正如文件所说,它只改变了元数据。配置单元分区被实现为具有命名模式columnname=spec的目录,因此您还需要使用“hadoop fs”命令更改hdfs上那些目录的名称。