我有一个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 我可能做错了什么想法?
答案 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“
中的字符串形式的任何遗留数据答案 2 :(得分:0)
您可以创建不带分区的表副本,然后更新表的列,然后使用分区重新创建第一个
create table table_name partitioned by (table_column) as
select
*
from
source_table
对我有用。