美文网首页
【Hive系列】Hive快速复制一张分区表及数据

【Hive系列】Hive快速复制一张分区表及数据

作者: 木亦汐 | 来源:发表于2019-04-02 17:54 被阅读0次

    关键字:Hive 复制表

    Hive中有时候会遇到复制表的需求,复制表指的是复制表结构和数据。

    如果是针对非分区表,那很简单,可以使用CREATE TABLE new_table AS SELECT * FROM old_table;

    那么如果是分区表呢?

    首先想到的办法可能是:

    先创建一张和old_table结构相同的new_table,包括分区;可以使用CREATE TABLE new_table LIKE old_table;

    接下来使用动态分区,把old_table的数据INSERT到new_table中。

    这个方法当然可以,但可能不是最快的。

    其实可以这样做:

      1. CREATE TABLE new_table LIKE old_table;
      1. 使用hadoop fs -cp 命令,把old_table对应的HDFS目录的文件夹全部拷贝到new_table对应的HDFS目录下;
      1. 使用MSCK REPAIR TABLE new_table;修复新表的分区元数据;

    看例子:

    有一张分区表t1,只有两个分区,每个分区中都有一条数据,如下:

    hive> show partitions t1;
    OK
    pt=2019-04-01
    pt=2019-04-02
    Time taken: 0.11 seconds, Fetched: 2 row(s)
    hive> desc t1;
    OK
    id                      string                                      
    pt                      string                                      
                     
    # Partition Information          
    # col_name              data_type               comment             
                     
    pt                      string                                      
    Time taken: 0.123 seconds, Fetched: 7 row(s)
    hive> select * from t1;
    OK
    X       2019-04-01
    Y       2019-04-02
    Time taken: 0.095 seconds, Fetched: 2 row(s)
    hive> 
    

    创建一张相同表结构的新表t2;

    hive> create table t2 like t1;
    OK
    Time taken: 0.162 seconds
    hive> desc t2;
    OK
    id                      string                                      
    pt                      string                                      
                     
    # Partition Information          
    # col_name              data_type               comment             
                     
    pt                      string                                      
    Time taken: 0.139 seconds, Fetched: 7 row(s)
    hive> show partitions t2;
    OK
    Time taken: 0.082 seconds
    

    使用hadoop fs -cp命令把t1对应HDFS目录的所有文件夹复制到t2对应的HDFS目录下:

    [hadoop@localhost ~]$ hadoop fs -cp /user/hive/warehouse/wodlee.db/t1/* /user/hive/warehouse/wodlee.db/t2/
    [hadoop@localhost ~]$ hadoop fs -ls /user/hive/warehouse/wodlee.db/t2/
    Found 2 items
    drwxr-xr-x   - hadoop hadoop          0 2019-04-02 17:17 /user/hive/warehouse/wodlee.db/t2/pt=2019-04-01
    drwxr-xr-x   - hadoop hadoop          0 2019-04-02 17:17 /user/hive/warehouse/wodlee.db/t2/pt=2019-04-02
    

    在Hive用使用MSCK REPAIR TABLE t2;修复新表t2的分区元数据;

    hive> show partitions t2;
    OK
    Time taken: 0.082 seconds
    hive> MSCK REPAIR TABLE t2;
    OK
    Partitions not in metastore:    t2:pt=2019-04-01        t2:pt=2019-04-02
    Repair: Added partition to metastore t2:pt=2019-04-01
    Repair: Added partition to metastore t2:pt=2019-04-02
    Time taken: 0.249 seconds, Fetched: 3 row(s)
    hive> show partitions t2;
    OK
    pt=2019-04-01
    pt=2019-04-02
    Time taken: 0.068 seconds, Fetched: 2 row(s)
    hive> select * from t2;
    OK
    X       2019-04-01
    Y       2019-04-02
    Time taken: 0.123 seconds, Fetched: 2 row(s)
    hive> 
    

    OK,新表t2已经复制好了,它和t1有着相同的表结构,分区结构,分区以及数据。

    相关文章

      网友评论

          本文标题:【Hive系列】Hive快速复制一张分区表及数据

          本文链接:https://www.haomeiwen.com/subject/svxnbqtx.html