Hadoop 如何更改配置单元分区列名
我必须更改分区列名(不是分区规范),我在HiveWiki和一些google页面中查找命令。我可以找到修改分区规格的选项 例如 在/table/country='US'中,我可以把我们换成美国,但我想把国家换成大陆 我觉得更改分区列名的唯一选择是删除并重新创建表。还有其他选择吗?请帮助我Hadoop 如何更改配置单元分区列名,hadoop,hive,hiveql,Hadoop,Hive,Hiveql,我必须更改分区列名(不是分区规范),我在HiveWiki和一些google页面中查找命令。我可以找到修改分区规格的选项 例如 在/table/country='US'中,我可以把我们换成美国,但我想把国家换成大陆 我觉得更改分区列名的唯一选择是删除并重新创建表。还有其他选择吗?请帮助我 提前感谢。您可以通过以下方式更改元数据中的列名: 但正如文档所说,它只改变元数据。配置单元分区被实现为命名模式为columnName=spec的目录。因此,您还需要使用“hadoop fs”命令更改HDFS上这
提前感谢。您可以通过以下方式更改元数据中的列名:
但正如文档所说,它只改变元数据。配置单元分区被实现为命名模式为columnName=spec的目录。因此,您还需要使用“hadoop fs”命令更改HDFS上这些目录的名称。在此处添加解决方案供以后使用:
- 用例:将分区列从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;
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'
...
这样,您可以查询不同粒度级别的数据(在本例中为大陆和国家)。您可以使用简单的交换方法更改分区列
- 创建与当前表架构相同的新临时表
- 将旧表中的所有文件移动到新创建表的位置 hadoop fs-mv
- 更改原始表的架构(重命名或删除分区)
- 使用适当的分区值将临时表数据重新复制/加载到原始表 hadoop fs-mv
- msck修复原始表格并删除临时表格
注意:mv命令将文件从一个位置移动到另一个位置,以减少复制时间。或者,我们可以使用
LOAD DATA INPATH
将数据复制到原始表。您不能更改配置单元中的分区列。事实上,配置单元不支持更改分区列
您可以这样想—配置单元通过在hdfs中创建一个具有分区列值的文件夹来存储数据—因为如果您试图更改配置单元分区,则意味着您试图更改配置单元表的整个目录结构和数据,如果您已按年份分区,则这是不可能的。这就是目录结构的外观像
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
您好,您能找到解决方案吗?您可以更改列名,但不能更改分区名一旦分区列的名称发生更改,这将无法回答此问题。我也遇到了同样的问题,当尝试运行更改代码时,我得到了以下错误:
处理语句时出错:失败:执行错误,从org.apache.hadoop.hive.ql.exec.ddlstask返回代码1。列引用semanaano无效(状态=08S01,代码=1)