如何重命名配置单元中的分区值?

jei2mxaa  于 2021-06-28  发布在  Hive
关注(0)|答案(3)|浏览(316)

我有一个配置单元表“videotracking\u 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 我已经确认这个分区存在,并且我认为我使用了正确的语法。我的配置单元版本是配置单元1.1.0,你知道我做错了什么吗?

pgccezyw

pgccezyw1#

重命名用于更改分区列的值。其中一个用例是,您可以使用此语句规范化遗留分区列值以符合其类型。在这种情况下,即使hive.typecheck.on.insert属性设置为true(默认值),也不会为旧分区规范中的列值启用类型转换和规范化,这允许您以字符串形式指定旧分区规范中的任何旧数据
bug打开https://issues.apache.org/jira/browse/hive-10362

nhjlsmyf

nhjlsmyf2#

重命名分区的旧版本配置单元出现问题。这对你的案子来说也是个问题。有关详细信息,请参见此链接。
如果您使用的是旧版本的配置单元,那么在执行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>

此问题已在配置单元的最新版本中修复。在我的例子中,配置单元版本是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>

希望对你有帮助。

fae0ux8s

fae0ux8s3#

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

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

对我有用。

相关问题