如何更改Hive分区列名称

时间:2015-08-20 06:31:30

标签: hadoop hive hiveql

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

即。例如

在/ table / country ='美国'我可以将美国更改为美国,但我想将国家更改为大陆

我觉得可用于更改分区列名的唯一选项是删除并重新创建表。有没有其他选择可以帮助我。

提前致谢。

5 个答案:

答案 0 :(得分:2)

您可以通过以下方式更改元数据中的列名: https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-ChangeColumnName/Type/Position/Comment

但正如文件所说,它只会改变元数据。 Hive分区实现为具有命名模式columnName = spec的目录。因此,您还需要使用“hadoop fs”命令更改HDFS上这些目录的名称。

答案 1 :(得分:0)

您已经使用简单的交换方法更改了分区列。

  • 创建一个新的临时表,该表与当前表的架构相同。
  • 移动旧表中的所有文件以重新创建表位置。

    table['number_index'] = table['number_' + str(table['index'])]

  • 更改原始表的架构(重命名或删除分区)
  • 使用适当的分区值将临时表数据复制/加载到原始表中。

    hadoop fs -mv <current_table_name> <temp_table_name>

  • msck修复原始表并删除temp_table。

注意: mv 命令将文件从一个位置移动到另一位置,从而减少了复制时间。或者,我们可以使用hadoop fs -mv <temp_table_name> <current_table_name>将数据复制到原始表中。

答案 2 :(得分:0)

您不能在配置单元中更改分区列实际上配置单元不支持更改分区列

您可以这样考虑-Hive通过在hdfs中创建一个具有分区列值的文件夹来存储数据-由于如果您尝试更改hive分区,则意味着您正在尝试更改hive的整个目录结构和数据表,如果按年份分区,则不可能exp这是目录结构的样子

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

答案 3 :(得分:-1)

在此处添加解决方案以供日后使用:

  • 使用案例:将分区列从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;
    

答案 4 :(得分:-1)

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

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

我知道这不是你想要的。遗憾的是,鉴于您的数据已经被国家/地区分区,您唯一的选择是删除表格,从HDFS中删除数据(假设您的表格是外部的),然后使用continent重新插入数据分区。

在您的情况下,我要做的是拥有多个分区级别,以便您的文件夹结构如下所示:

/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'
...

通过这种方式,您可以查询不同粒度级别的数据(在本例中为大陆国家)。