如何在Hive中重命名分区值?

时间:2016-12-13 15:17:12

标签: hive

我有一个hive表'videotracking_playevent',它使用以下分区格式(所有字符串):source / createyear / createmonth / createday。 示例:source = home / createyear = 2016 / createmonth = 9 / createday = 1

我正在尝试更新createmonth和createday的分区值,以便始终使用两位数。 示例:source = home / createyear = 2016 / createmonth = 09 / createday = 01

我尝试过以下查询:

ALTER TABLE videotracking_playevent PARTITION (
source='home', 
createyear='2015', 
createmonth='11', 
createday='1'
) RENAME TO PARTITION (
source='home', 
createyear='2015', 
createmonth='11', 
createday='01'
);

然而,这会从配置单元中返回以下非描述性错误:Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. null

我已经确认这个分区存在,我想我正在使用正确的语法。我的hive版本是Hive 1.1.0 我可能做错了什么想法?

3 个答案:

答案 0 :(得分:2)

旧版Hive与重命名分区存在问题。这也可能是您案件的问题。有关详细信息,请参阅此link

如果您使用的是较早版本的Hive,则需要在执行rename partition命令之前设置以下两个属性。

set fs.hdfs.impl.disable.cache=false; 
set fs.file.impl.disable.cache=false; 

现在通过设置此属性来运行查询。

hive> set fs.hdfs.impl.disable.cache=false;
hive> set  fs.file.impl.disable.cache=false;
hive> ALTER TABLE partition_test PARTITION (year='2016',day='1') RENAME TO PARTITION (year='2016',day='01');
OK
Time taken: 0.28 seconds
hive> show partitions partition_test;
OK
year=2016/day=01
Time taken: 0.091 seconds, Fetched: 1 row(s)
hive>

此问题已在Hive最新版本中修复。在我的情况下,Hive版本是1.2.1并且它可以工作,而不设置该属性。请参阅下面的示例。

创建分区表。

hive> create table partition_test(
    > name string,
    > age int)
    > partitioned by (year string, day string);
OK
Time taken: 5.35 seconds
hive> 

现在添加分区并检查新添加的分区。

hive> alter table partition_test ADD PARTITION (year='2016', day='1');
OK
Time taken: 0.137 seconds
hive>


hive> show partitions partition_test;
OK
year=2016/day=1
Time taken: 0.169 seconds, Fetched: 1 row(s)
hive>

使用RENAME TO PARTITION命令重命名分区并检查它。

hive> ALTER TABLE partition_test PARTITION (year='2016',day='1') RENAME TO PARTITION (year='2016',day='01');
OK
Time taken: 0.28 seconds
hive> show partitions partition_test;
OK
year=2016/day=01
Time taken: 0.091 seconds, Fetched: 1 row(s)
hive>

希望它对你有所帮助。

答案 1 :(得分:0)

重命名可让您更改分区列的值。其中一个用例是您可以使用此语句规范化旧分区列值以符合其类型。在这种情况下,即使将属性 hive.typecheck.on.insert设置为true (默认值),也可以指定旧partition_spec中的列值的类型转换和规范化,这允许您指定旧partition_spec“

中的字符串形式的任何遗留数据

错误打开 https://issues.apache.org/jira/browse/HIVE-10362

答案 2 :(得分:0)

您可以创建不带分区的表副本,然后更新表的列,然后使用分区重新创建第一个

create table table_name partitioned by (table_column) as 
select
   * 
from
   source_table

对我有用。