如何按所有值对表进行分区?

6ljaweal  于 2021-06-27  发布在  Hive
关注(0)|答案(1)|浏览(379)

我有一个外部表,现在我想给它添加分区。我有224个独特的城市身份证,我只想写 alter table my_table add partition (cityid) location /path; 但是hive抱怨说,我没有提供任何关于城市id值的信息,应该是例如。 alter table my_table add partition (cityid=VALUE) location /path; ,但我不想跑 alter table 城市id的每一个值的命令,我如何能一次完成所有id的命令?
这是配置单元命令行的外观:

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

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

osh3o9ms

osh3o9ms1#

物理层上的分区是一个位置(每个值的单独位置,通常如下所示 key=value )数据文件。如果已经有了带有文件的分区目录结构,那么只需在hivemetastore中创建分区,就可以使用将表指向根目录 ALTER TABLE SET LOCATION ,然后使用 MSCK REPAIR TABLE 命令。amazon elastic mapreduce(emr)版本的hive上的等效命令是: ALTER TABLE table_name RECOVER PARTITIONS . 这将添加配置单元分区元数据。请参阅此处的手册:恢复分区
如果您的表位置中只有未分区的数据,则添加分区将不起作用,因为需要重新加载数据,您需要:
创建另一个分区表并使用 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

这是一种非常有效的重新组织数据的方法。
在此之后,可以删除源表并重命名目标表。

相关问题