目录
5 DML操作
5.1 数据导入
5.1.1 向表中加载数据(load)
5.1.2 通过查询语句向表中插入数据(Insert)
5.1.3 查询语句中创建表并加载数据(As Select)
5.1.4 创建表时通过location指定加载数据路径
5.1.5 Import数据到指定Hive表中
5.2 数据导出
5.2.1 Insert导出
5.2.2 Hadoop与hive Shell导出到本地对比
5.2.3 Export 导出到HDFS上
5.3 清除表中数据
6 DQL查询
其他常用的查询函数
7 函数
7.1 系统内置函数
7.2 自定以函数
7.3 自定义UDF函数
1. 语法:
hive> load data [local] inpath '/opt/module/datas/student.txt' [overwrite] into table student
(1)load data:表示加载数据
(2)local:表示从本地加载数据到hive表(复制);否则从HDFS加载数据到hive表(移动)
(3)inpath:表示加载数据的路径
(4)overwrite into:表示覆盖表中已有数据,否则表示追加
(5)into table:表示加载到哪张表
(6)student:表示具体的表
2. 案例
(1)创建一张表
hive (default)> create table student(id string, name string) row format delimited fields terminated by '\t';
(2)加载本地文件到hive
hive (default)> load data local inpath '/opt/module/datas/student.txt' into table default.student;
(3)加载HDFS文件到hive中
上传文件到HDFS
hive (default)> dfs -put /opt/module/datas/student.txt /user/hadoop/hive;
加载HDFS上数据(从hdfs上加载数据为移动而不是复制)
hive (default)> load data inpath '/user/root/hive/student.txt' into table default.student;
(4)加载数据覆盖表中已有的数据
上传文件到HDFS
hive (default)> dfs -put /opt/module/datas/student.txt /user/hadoop/hive;
加载数据覆盖表中已有的数据
hive (default)> load data inpath '/user/hadoop/hive/student.txt' overwrite into table default.student;
1.创建一张表
hive (default)> create table student(id int, name string) row format delimited fields terminated by '\t';
2.基本插入数据
hive (default)> insert into table student values(1,'wangwang');
快速复制表数据(快速备份)
insert into table student select * from student1;
根据查询到的结果创建表(查询到的结果会添加到新创建的表中)
create table if not exists student3 as select id, name from student;
1. 创建表,并指定在hdfs上的位置(如果当前路径没有数据,表为空,等到该路径有数据时再加载)
hive (default)> create table if not exists student4( id int, name string )
row format delimited fields terminated by '\t' location '/user/hive/warehouse/student4';
hive (default)> import table student8 from '/user/hive/warehouse/export/student';
1. 将查询结果导出到本地
hive (default)>insert overwrite local directory '/opt/module/datas/export/student' select * from student;
2. 将查询到的结果格式化导出到本地
hive (default)>insert overwrite local directory '/opt/module/datas/export/student1' row format delimited fields terminated by '\t'
select * from student;
3. 将查询到的结果导出到HDFS上(把local去掉即可)
hive (default)>insert overwrite directory '/opt/module/datas/export/student1' row format delimited fields terminated by '\t'
select * from student;
1. hadoop
hive (default)> dfs -get /user/hive/warehouse/student/student.txt /opt/module/datas/export/student3.txt;
2. hive Shell
[hadoop@hadoop101 hive]$ bin/hive -e 'select * from default.student;' > /opt/module/datas/export/student4.txt;
hive (default)>export table default.student to '/user/hive/warehouse/export/student';
hive (default)> truncate table student;
查询基本语法(与数据库查询基本一致)
SELECT [ALL | DISTINCT] select_expr, select_expr, ...
FROM table_reference
[WHERE where_condition]
[GROUP BY col_list]
[ORDER BY col_list]
[SORT BY col_list]
[LIMIT number]
HQL和SQL语法基本上一致,这也是Hive的一个很大优势,很容易使熟悉sql的人员上手,下面就值介绍一些Hive的不同之处:
1. Like和RLike
RLike是Hive中的一个扩展,其可以通过Java的正则表达式这个更强大的语言来直指定匹配条件
比如:Rlike查询员工薪水中包含2的员工信息
hive (default)> select * from emp where sal RLIKE '[2]';
2. HQL底层是将查询语句翻译为MapReduce程序
sory by:是对MapReduce内部进行排序,对全局结果集来说不是排序(也就是说分区内有序,全局不一定有序)
既然HQL最后是MapReduce程序,那么我们就可以设置reduce的个数
设置reduce个数:
hive (default)> set mapreduce.job.reduces=3;
查看reduce的个数
hive (default)> set mapreduce.job.reduces;
1. 空字段赋值
NVL:给值为NULL的数据赋值,它的格式是NVL( string1, replace_with)。它的功能是如果string1为NULL,则NVL函数返回replace_with的值,否则返回string1的值,如果两个参数都为NULL ,则返回NULL。
例如:oracle数据库推广使用过的一个例子,计算每个员工的年薪(12*sla + comm)
select ename,(sal*12 + nvl(comm,0)) yearSal from emp;
例二:如果员工的comm为null,则用领导id代替
hive (default)> select nvl(comm,mgr) from emp;
2. case when
1. 准备数据
name |
dept_id |
sex |
八戒 |
A |
男 |
猴哥 |
A |
男 |
松松 |
B |
男 |
凤姐 |
A |
女 |
小可爱 |
B |
女 |
萌萌 |
B |
女 |
2.需求
求出不同部门男女各多少人。结果如下:
A 2 1
B 1 2
3.创建本地emp_sex.txt,导入数据
[bigdata@hadoop102 datas]$ vim emp_sex.txt
八戒 A 男
猴哥 A 男
松松 B 男
凤姐 A 女
小可爱 B 女
萌萌 B 女
4.创建hive表并导入数据
create table emp_sex(name string, dept_id string, sex string)
row format delimited fields terminated by "\t";
load data local inpath '/opt/module/datas/emp_sex.txt' into table emp_sex;
5.按需求查询数据
select
dept_id,
sum(case sex when '男' then 1 else 0 end) male_count,
sum(case sex when '女' then 1 else 0 end) female_count
from
emp_sex
group by
dept_id;
3. 行转列
1. 相关函数说明
CONCAT(string A/col, string B/col…):返回输入字符串连接后的结果,支持任意个输入字符串;
CONCAT_WS(separator, str1, str2,...):它是一个特殊形式的 CONCAT()。第一个参数为剩余参数间的分隔符。分隔符可以是与剩余参数一样的字符串。如果分隔符是 NULL,返回值也将为 NULL。这个函数会跳过分隔符参数后的任何 NULL 和空字符串。分隔符将被加到被连接的字符串之间;
COLLECT_SET(col):函数只接受基本数据类型,它的主要作用是将某字段的值进行去重汇总,产生array类型字段。
2. 数据
name |
Constellation |
blood_type |
八戒 |
白羊座 |
A |
猴哥 |
射手座 |
A |
松松 |
白羊座 |
B |
猪八戒 |
白羊座 |
A |
凤姐 |
射手座 |
A |
3. 需求: 把星座和血型一样的人归类到一起。结果如下:
射手座,A 猴哥|凤姐
白羊座,A 八戒|猪八戒
白羊座,B 松松
4.创建本地person.txt,导入数据
[bigdata@hadoop102 datas]$ vim person.txt
八戒 白羊座 A
猴哥 射手座 A
松松 白羊座 B
猪八戒 白羊座 A
凤姐 射手座 A
5.创建hive表并导入数据
create table person_info(name string, xingzuo string, blood_type string)
row format delimited fields terminated by "\t";
load data local inpath '/opt/module/datas/person.txt' into table person_info;
分析:
6. 实现
select
t1.base,
concat_ws('|', collect_set(t1.name)) name
from
(select
name,
concat(xingzuo, ',' , blood_type) base
from
person_info) t1
group by
t1.base;
4. 列转行
1. 函数说明
EXPLODE(col):将hive一列中复杂的array或者map结构拆分成多行。
LATERAL VIEW
用法:LATERAL VIEW udtf(expression) tableAlias AS columnAlias
解释:用于和split, explode等UDTF一起使用,它能够将一列数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。
2. 数据准备
Movie |
category |
《福尔摩斯》 |
悬疑,动作,科幻,剧情 |
《无间道》 |
悬疑,警匪,动作,心理,剧情 |
《红海行动》 |
战争,动作,灾难 |
3. 需求:将电影分类中的数组展开。结果如下:
《福尔摩斯》 悬疑 《福尔摩斯》 动作 《福尔摩斯》 科幻 《福尔摩斯》 剧情 《无间道》 悬疑 《无间道》 警匪 《无间道》 动作 《无间道》 心理 《无间道》 剧情 《红海行动》 战争 《红海行动》 动作 《红海行动》 灾难 |
4. 创建本地movie.txt,导入数据
[bigdata@hadoop102 datas]$ vi movie.txt
《福尔摩斯》 悬疑,动作,科幻,剧情
《无间道》 悬疑,警匪,动作,心理,剧情
《红海行动》 战争,动作,灾难
5.创建hive表并导入数据
create table movie_info( movie string, category array
) row format delimited fields terminated by "\t"
collection items terminated by ","; //第二个字段以,分割
load data local inpath "/opt/module/datas/movie.txt" into table movie_info;
6.按需求查询数据
select movie, category_name
from movie_info lateral view explode(category) table_tmp as category_name;
1.查看系统自带的函数
hive> show functions;
2.显示自带的函数的用法
hive> desc function upper;
3.详细显示自带的函数的用法
hive> desc function extended upper;
1)Hive 自带了一些函数,比如:max/min等,但是数量有限,自己可以通过自定义UDF来方便的扩展。
2)当Hive提供的内置函数无法满足你的业务处理需要时,此时就可以考虑使用用户自定义函数(UDF:user-defined function)。
3)根据用户自定义函数类别分为以下三种:
(1)UDF(User-Defined-Function) 一进一出
(2)UDAF(User-Defined Aggregation Function)聚集函数,多进一出 类似于:count/max/min
(3)UDTF(User-Defined Table-Generating Functions)一进多出 如lateral view explore()
4)官方文档地址:https://cwiki.apache.org/confluence/display/Hive/HivePlugins
5)编程步骤:
(1)继承org.apache.hadoop.hive.ql.UDF
(2)需要实现evaluate函数;evaluate函数支持重载;
(3)在hive的命令行窗口创建函数
a)添加jar
add jar linux_jar_path
b)创建function,
create [temporary] function [dbname.]function_name AS class_name;
(4)在hive的命令行窗口删除函数
drop [temporary] function [if exists] [dbname.]function_name;
6)注意事项
(1)UDF必须要有返回类型,可以返回null,但是返回类型不能为void;
org.apache.hive
hive-exec
1.2.1
3.创建一个类
package com.bigdata.hive;
import org.apache.hadoop.hive.ql.exec.UDF;
public class Lower extends UDF {
public String evaluate (final String s) {
if (s == null) {
return null;
}
return s.toLowerCase();
}
}
4.打成jar包上传到服务器/opt/module/jars/udf.jar
5.将jar包添加到hive的classpath
hive (default)> add jar /opt/module/jars/udf.jar;
6.创建临时函数与开发好的java class关联
hive (default)> create temporary function mylower as "com.bigdata.hive.Lower";
7.即可在hql中使用自定义的函数strip
hive (default)> select ename, mylower(ename) lowername from emp;