1 hive数据加载方式:

a) 使用load加载

b) 用查询语句向表中插入数据

a) 使用LOAD DATA方式加载数据详解:

命令格式如下

Java代码 收藏代码

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) 动静态分区插入结合使用:

Java代码 收藏代码

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中