hive-2 数据导入导出方式(分区表)


1 hive数据加载方式:
a) 使用load加载
b) 用查询语句向表中插入数据

a) 使用LOAD DATA方式加载数据详解:
命令格式如下

LOAD DATA 【LOCAL】 INPATH ‘....’ 【OVERWRITE】 INTO TABLE t1 【PARTITION (...)】
eg: load data local inpath '/usr/local/data/user' into table jiuye partition(grade='1');   

以上内容中,方括号中的表示可选部分。分别解释以下:
LOCAL 表示从本地加载数据,即Linux文件系统,这时数据会复制到HDFS的Hive仓库中;如果不使用LOCAL,指的是数据从HDFS的某个路径移动到Hive仓库中。
OVERWRITE指的是否覆盖原始数据。如果不使用OVERWRITE,但是已经导入过这批数据,那么新的导入依然能够成功,即产生两份,而不是覆盖掉原来的那一份
PARTITION指的是导入到指定分区表中。

b) 使用查询语句向表中插入数据详解:

INSERT OVERWRITE TABLE t1 SELECT * FROM t2; // 也可以不覆盖,直接导入,把关键词OVERWRITE替换为INTO即可
数据加载到一个分区中写法:
INSERT OVERWRITE TABLE t2 PARTITION (day=2) SELECT * FROM t1;//将t1表的数据加载到分区为day=2的表t2中
数据同时加载到多个分区中/或者同时加载到多个表中(数据源只有一个) 
可以这么写:
INSERT OVERWRITE TABLE t2 PARTITION (day=2) SELECT * FROM t1;
INSERT OVERWRITE TABLE t2 PARTITION (day=3) SELECT * FROM t1;
.....
这么写的坏处是SELECT * FROM t1每一次都会进行一次遍历,这样耗时,

将t1中day=2的id写入到表t2的分区day=2文件夹下的文件中
将t1中day=3的id写入到表t2的分区day=3文件夹下的文件中
将t1中day=4的id写入到表t4中
改进写法:(只扫描一次原始表,高效)
FROM t1  
INSERT OVERWRITE TABLE t2 PARTITION(day=2) SELECT id WHERE day=2    
INSERT OVERWRITE TABLE t2 PARTITION(day=3) SELECT id WHERE day=3 
INSERT OVERWRITE TABLE t4 SELECT id WHERE day=4 

c) 动态分区插入:

插入数据时,分区数据是动态的,不是如上面静态写死的,
默认,Hive是支持动态分区插入的。如果不支持的话,可以设置  hive.exec.dynamic.partition=true;打开

动态分区插入语法如下
set  hive.exec.dynamic.partition=true;
set  hive.exec.dynamic.partition.mode=nonstrict;
set  hive.exec.max.dynamic.partitions.pernode=1000;
INSERT OVERWRITE TABLE t2 PARTITION (province, city) SELECT ....... , a.province, a.city FROM a;

注意:
动态分区字段一定要放在所有静态字段的后面,这里业务字段在前,最后 a.province, a.city作为动态分区字段会被赋到PARTITION (province, city)中
INSERT OVERWRITE TABLE t2 PARTITION (province, city) SELECT  业务字段 , a.province, a.city FROM a;

d) 动静态分区插入结合使用:

INSERT OVERWRITE TABLE t2 PARTITION (province=’beijing’, city) SELECT ....... , a.city FROM a;
此时,SELECT ....... ,  都是作为业务字段被赋值到t2表中的,而 a.city则是作为动态分区字段查询到后赋值到 t2的分区字段中的。

2 hive数据导出方式:

一是直接使用HDFS命令导出文件夹。
二是使用如下语法
insert overwrite local directory ‘/tmp/t1’ SELECT id FROM t1; // directory表示存放目录
// 将t1的id数据导出到本地磁盘文件 /tmp/t1中

猜你喜欢

转载自chengjianxiaoxue.iteye.com/blog/2167172