我们如何在Hive中重命名多个分区?

时间:2018-12-05 12:17:22

标签: hive hiveql partitioning hive-partitions

如果有两个分区列,例如学校名称和班级 如何重命名所有学校分区中都存在的特定班级分区

所以

/ school = ABC / class = 1 /

/ school = PQR / class = 1 /

class = 1应该转换为class = 2

/ school = ABC / class = 2 /

/ school = PQR / class = 2 /

编辑:在此示例中,只有两所学校,但这是可变的,可能有数千所学校。

2 个答案:

答案 0 :(得分:0)

如果表是托管表,则只需使用以下命令即可重命名分区,

  

变更表tbl_name PARTITION(school ='ABC',class = 1)重命名为   分区(school ='ABC',class = 2);

     

变更表tbl_name PARTITION(school ='PQR',class = 1)重命名为   分区(school ='PQR',class = 2);

下面是我在蜂巢中尝试过的执行力,

  

hive>创建表tbl_name(

     
    

名称字符串,     年龄int)     按(学校字符串,班级int)划分;

  
     

hive>更改表tbl_name ADD PARTITION(school ='ABC',class = 1);好   耗时:0.157秒

     

配置单元> alter table tbl_name ADD PARTITION(school ='PQR',class = 1);好   耗时:0.128秒

     

hive>显示分区tbl_name; OK学校= ABC /班级= 1   school = PQR / class = 1

     

配置单元> alter table tbl_name PARTITION(school ='ABC',class = 1)重命名为   分区(school ='ABC',class = 2); OK时间:0.468秒

     

hive>更改表tbl_name PARTITION(school ='PQR',class = 1)重命名为   分区(school ='PQR',class = 2); OK时间:0.432秒

     

hive>显示分区tbl_name; OK学校= ABC /班级= 2   school = PQR / class = 2

希望这会有所帮助。

答案 1 :(得分:0)

您可以尝试从元数据中获取分区信息。

1>从hive-site.xml文件(位置:/hive/installation/location/hive/hive-2.1/conf)中获取元数据信息

2>获取环境和凭据

 <property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>[hostname]</value>
    <description>JDBC connect string for a JDBC metastore</description>
</property>


 <property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>UserName</value>
    <description>username to use against metastore database</description>
 </property>

 <property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>PWD</value>
    <description>password to use against metastore database</description>
 </property>

3>连接到metastore,下面是获取分区信息的查询。

select D.NAME, P.PART_NAME,  T.TBL_NAME from PARTITIONS P INNER JOIN TBLS T ON P.TBL_ID=T.TBL_ID INNER JOIN DBS D ON T.DB_ID=D.DB_ID WHERE D.NAME=<DBNAME> AND T.TBL_NAME=<TBLNAME> AND P.PART_NAME LIKE '%class=2%';

一旦有了分区信息,就可以使用replace和concat函数来获取alter语句。

希望这会有所帮助。