目录
1.hadoop fs -put的方式
语法:hadoop fs -put 数据文件名 HDFS目录 的形式暴力导入。【不太推荐】
hadoop fs -put students.txt /home/hadoopUser/apps/hive/warehouse/myhive1029.db/stu1029/
2.load的方式
可查看hive的官方文档
LOAD DATA [LOCAL] INPATH ‘filepath’ [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 …)]
说明:
LOAD操作是单纯的复制或者移动,将数据文件移动到hive表对应的位置。
【local】查找本地linux的filepath位置。
【overwrite】先清空hive表目录下的所有文件,然后再把filepath文件添加进去。
-
从本地目录导入数据到hive表,需要添加【local】关键字
从本地目录复制文件到hive表目录下
load data local inpath “/home/hadoopUser/文件名” into table 表名; -
从HDFS目录导入数据到hive表,不需要添加【local】关键字
从HDFS目录剪切文件到hive表目录下
load data inpath “/HDFS目录/文件名” into table 表名;
3.insert…values的方式
该语法和mysq插入数据的语法一样。一般不常用,可能在测试的时候会用到这种方式。
实际工作中一般数据都是存放在文件中,通过load的方式批量导入到表内。
如果要使用该方法,必须保证hadoop集群已经启动,因为这个语法是将sql语句转化为mapreduce程序交给yarn执行的。
4.insert…select的方式
假如我现在已经有2张表,一张是t1表(空表),一张是mystu表(有数据的表),我想把mystu表筛选出性别为女的数据,放到t1表中。
语法:
insert into table t1 select * from mystu where gender = “女”;
-
创建t1表:
create table t1(id int,name string,gender string,age int) row format delimited fields terminated by “,” lines terminated by “\n”;由于是从已有的表中筛选数据放入t1表,已有的表格数据已经进行了分隔,因此在创建t1表可以不用设置分隔字段,直接写
create table t1(id int,name string,gender string,age int); -
把mystu表中性别为女的数据筛选出来放到t1中:
insert into table t1 select id,name,gender,age from mystu where gender = “女”;
t1表创建的是内部表,t1目录下的文件是select筛选性别为女然后insert进t1的数据文件。
5.CTAS的方式(比第4种方式更加简便)
在创建t2表的同时就把mystu筛选的数据导入。
select查询筛选出来的是一张虚表数据,通过下面的语法,将虚表变成一张实表t2。
语法:
create table 表(可加字段)as select…
- 表字段跟select后的字段一样。
创建t2表,同时把mystu筛选的数据导入t2。
create table t2 as select * from mystu where gender = “女”;
6.create views视图的方式(比第5种方式更加简便)
创建视图的时候,as后面sql的语句可以延迟执行。
语法:
create view 表名 as 子查询语句
创建t3_id
create view t3_id as select id,name from mystu;
创建t3_dp
create view t3_dp as select id,department from mystu;
创建这两个视图,子查询select是没有执行的,但是show tables;能够查看到视图,hive仓库目录下也不会有视图信息。
当工作中需要多个子查询的时候,create view 比 CTAS 更好用,因为创建视图时,后面的子查询语句没有执行。
而在做一些比如视图的连接查询的时候,此时子查询语句才会一起执行,然后经过hive优化的效率更高。
例子:
select t3_id.* ,t3_dp.* from t3_id join t3_dp on t3_id.id = t3_dp.id;
执行过后select * from 视图 就有结果。
create views和CTAS区别
- create views的时候,子查询语句没有执行。
但是CTAS是必须执行子查询sql语句的。 - 当工作中的需求需要多个sql语句才能执行出来的时候,create views可以把多个sql语句先攒起来不执行,最后通过hive优化后再一起执行,效率更高。
而CTAS则是每个sql语句都会先执行。