2

我有一个外部表,现在我想给它添加分区。我有 224 个唯一的城市 id,我只想写alter table my_table add partition (cityid) location /path;,但蜂巢抱怨说我没有为城市 id 值提供任何东西,它应该是 eg alter table my_table add partition (cityid=VALUE) location /path;,但我不想alter table为城市 id 的每个值运行命令,我怎样才能一次完成所有id?

这是 hive 命令行的样子:

hive> alter table pavel.browserdata add partition (cityid) location '/user/maria_dev/data/cityidPartition';                                                                                                                                                                                                           

失败:ValidationFailureSemanticException 表未分区但分区规范存在:{cityid=null}

4

1 回答 1

2

key=value物理级别的分区是带有数据文件的位置(每个值的单独位置,通常看起来像)。如果您已经有了包含文件的分区目录结构,您只需在 Hive 元存储中创建分区,然后您可以使用 将您的表指向根目录ALTER TABLE SET LOCATION,然后使用MSCK REPAIR TABLE命令。Amazon Elastic MapReduce (EMR) 的 Hive 版本上的等效命令是:ALTER TABLE table_name RECOVER PARTITIONS. 这将添加 Hive 分区元数据。请参阅此处的手册:恢复分区

如果您只有未分区的表,其中包含数据,那么添加分区将不起作用,因为需要重新加载数据,您需要:

创建另一个分区表并使用insert overwrite动态分区加载来加载分区数据:

set hive.exec.dynamic.partition=true;   
set hive.exec.dynamic.partition.mode=nonstrict; 

insert overwrite table2 partition(cityid) 
select col1, ... colN,
       cityid    
  from table1; --partitions columns should be last in the select

这是重组数据的非常有效的方法。

在此之后,您可以删除源表并重命名目标表。

于 2018-12-27T16:20:32.333 回答