数据导入
Hive 可以理解是让人使用 SQL 表的方式去管理 HDFS 上的文件,那么 Hive 有一个很重要的操作就是把数据和表关联起来,即数据导入。数据导入通常有以下 4 种方法:
- LOAD: 加载文件数据到表
- INSERT:直接插入数据
- CTAS:建表时插入
- LOCATION:移动数据文件
0.准备数据
建表
hive> create table student(id string, name string) row format delimited fields terminated by '\t';
数据文件 $ vim students.txt(注意 id 和 name 之间用 Tab 键)
1 Jack
2 Rose
3 Ada
4 Reiser
1.LOAD
LOAD DATA 是直接将文件加载到 Hive 中,语法如下:
LOAD DATA [LOCAL] INPATH '...' OVERWRITE|INTO TABLE tb_name [PARTITION (pcol1=val1)];
LOCAL 表示本地文件路径,不加表示文件路径为 HDFS。OVERWRITE 表示覆盖之前的数据,INTO 表示数据追加。PARTITION 制定分区。 例子:
hive>LOAD DATA LOCAL INPATH '/home/hadoop/students.txt' INTO TABLE student;
2.INSERT
INSERT 如同 SQL 中的分区,语法如下:
INSERT INTO TABLE tb_name PARTITION(pcol1=val1)) VALUES(val1,val2);
PARTITION 为指定分区,VALUES是一行依此填写的值,例子:
hive> INSERT INTO TABLE student VALUES(5,'Jedi');
VALUES 可替换为查询结果,如:
单查询结果:
hive> INSERT OVERWRITE TABLE student PARTITION(month='201912')
SELECT id, name FROM student WHERE month='201911';
多查询结果:(FROM tb_name 放到最前面)
hive> FROM student
INSERT OVERWRITE TABLE student PARTITION(month='201910)
SELECT id, name WHERE month='201912'
INSERT OVERWRITE TABLE student PARTITION(month='201909')
SELECT id, name WHERE month='201912';
3.AS SELECT CTAS
CTAS 就是 create table as select , 即建表的时候用查询结果作为数据:
hive> CREATE TABLE student3 AS SELECT id, name FROM student;
4.LOCATION
还有一种方式是建表的时候就指定文件路径,后续将文件直接放入到该目录下。比如将 Spark 的结果文件放置该目录下,这样就可以直接通过 Hive 查询了。
create table if not exists student4(
id int, name string)
row format delimited fields terminated by '\t'
location '/user/hive/warehouse/student4';
注意:如果有 partition ,需要手动修复元数据
set hive.msck.path.validation=ignore;
MSCK REPAIR TABLE table_name;