Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/hadoop/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hadoop 如何更改配置单元分区列名_Hadoop_Hive_Hiveql - Fatal编程技术网

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

Hadoop 如何更改配置单元分区列名,hadoop,hive,hiveql,Hadoop,Hive,Hiveql,我必须更改分区列名(不是分区规范),我在HiveWiki和一些google页面中查找命令。我可以找到修改分区规格的选项 例如 在/table/country='US'中,我可以把我们换成美国,但我想把国家换成大陆 我觉得更改分区列名的唯一选择是删除并重新创建表。还有其他选择吗?请帮助我 提前感谢。您可以通过以下方式更改元数据中的列名: 但正如文档所说,它只改变元数据。配置单元分区被实现为命名模式为columnName=spec的目录。因此,您还需要使用“hadoop fs”命令更改HDFS上这

我必须更改分区列名(不是分区规范),我在HiveWiki和一些google页面中查找命令。我可以找到修改分区规格的选项

例如

在/table/country='US'中,我可以把我们换成美国,但我想把国家换成大陆

我觉得更改分区列名的唯一选择是删除并重新创建表。还有其他选择吗?请帮助我


提前感谢。

您可以通过以下方式更改元数据中的列名:


但正如文档所说,它只改变元数据。配置单元分区被实现为命名模式为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)