在使用Hive的过程中,复制表结构和数据是很常用的操作,本文介绍两种复制表结构和数据的方法。
1、复制非分区表表结构和数据
Hive集群中原本有一张bigdata17_old表,通过下面的SQL语句可以将bigdata17_old的表结构和数据复制到bigdata17_new表:CREATE TABLE bigdata17_new AS SELECT * FROM bigdata17_old;
如果是分区表,则必须使用like关键字复制表结构,包括分区,然后用insert语句将老表的数据插入新表中。
2、复制分区表表结构和数据
复制表SQL:CREATE TABLE bigdata17_new like bigdata17_old;
复制数据sql:insert overwrite table bigdata17_new partition(dt) select * from bigdata17_old;
如果遇到bigdata17_old表数据量巨大,有T以上的级别时,上述方法的效率则比较低。下面介绍一种快速复制表结构和表数据的方法。
从旧表中复制表结构,这个和上面介绍方法是一样的:CREATE TABLE bigdata17_new like bigdata17_old;
然后使用hadoop fs - cp命令将bigdata17_old旧表的数据拷贝到bigdata17_new新表:
hadoop fs -cp /user/warehouse/bigdata17.db/bigdata17_old/* /user/warehouse/bigdata17.db/bigdata17_new/然后执行MSCK REPAIR TABLE new_table;命令让两张表的分区元数据保持一致。
详细使用过程如下:
bigdata17_old表有两个字段,id和dt,其中dt是分区字段,一共有4条记录,两个分区:
hive> desc bigdata17_old; OK id int dt string # Partition Information # col_name data_type comment dt string Time taken: 0.147 seconds, Fetched: 7 row(s) hive> select * from bigdata17_old; OK 15 2018-10-13 18 2018-10-13 12 2018-10-14 13 2018-10-14 Time taken: 0.118 seconds, Fetched: 4 row(s) hive> show partitions bigdata17_old; OK dt=2018-10-13 dt=2018-10-14 Time taken: 0.113 seconds, Fetched: 2 row(s)创建表结构和bigdata17_old表一模一样的表bigdata17_new:
create table bigdata17_new like bigdata17_old;查看表bigdata17_new的表结构:
hive> show partitions bigdata17_new; OK Time taken: 0.153 seconds hive> desc bigdata17_new; OK id int dt string # Partition Information # col_name data_type comment dt string Time taken: 0.151 seconds, Fetched: 7 row(s)由于表bigdata17_new还没有数据,因此该表中没有分区信息。
将bigdata17_old目录下的数据文件拷贝到bigata17_new目录下:
[root@hadoop-master hive_test]# hadoop fs -cp /user/hive/warehouse/bigdata17.db/bigdata17_old/* /user/hive/warehouse/bigdata17.db/bigdata17_new/; 18/10/13 19:02:54 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable [root@hadoop-master hive_test]# hadoop fs -ls /user/hive/warehouse/bigdata17.db/bigdata17_new/ 18/10/13 19:03:26 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable Found 2 items drwxr-xr-x - root supergroup 0 2018-10-13 19:02 /user/hive/warehouse/bigdata17.db/bigdata17_new/dt=2018-10-13 drwxr-xr-x - root supergroup 0 2018-10-13 19:02 /user/hive/warehouse/bigdata17.db
