Hadoop之Hive查询语句

Posted 柳小葱

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hadoop之Hive查询语句相关的知识,希望对你有一定的参考价值。

即上一节我们讲到了数据的导入与导出,我们选择将查询语句单独放在一章,因为这一章比较重要。如果有需要看前面知识的同学可以到链接: Hadoop之Hive数据的导入与导出(DML).

1.数据准备

  • 创建数据
    我们要查询,当然少不了数据,这里我们创建两张表dept和emp
# dept表的数据
10	ACCOUNTING	1700
20	RESEARCH	1800
30	SALES	1900
40	OPERATIONS	1700


#emp的数据
7369	SMITH	CLERK	7902	1980-12-17	800.00		20
7499 	LLEN	SALESMAN	7698	1981-2-20	1600.00	300.00	30
7521 	WARD	SALESMAN	7698	1981-2-22	1250.00	500.00	30
7566	JONES	MANAGER	7839	1981-4-2	2975.00		20
7654	MARTIN	SALESMAN	7698	1981-9-28	1250.00	1400.00	30
7698	BLAKE	MANAGER	7839	1981-5-1	2850.00		30
7782	CLARK	MANAGER	7839	1981-6-9	2450.00		10
7788	SCOTT	ANALYST	7566	1987-4-19	3000.00		20
7839	KING	PRESIDENT		1981-11-17	5000.00		10
7844	TURNER	SALESMAN	7698	1981-9-8	1500.00	0.00	30
7876	ADAMS	CLERK	7788	1987-5-23	1100.00		20
7900	JAMES	CLERK	7698	1981-12-3	950.00		30
7902	FORD	ANALYST	7566	1981-12-3	3000.00		20
7934	MILLER	CLERK	7782	1982-1-23	1300.00		10

数据创建成功
在这里插入图片描述

  • 创建表dept和emp
--dept表字段
create table if not exists dept(
deptno int,
dname string,
loc int)
row format delimited fields terminated by '\\t';

--emp表字段
create table if not exists emp(
empno int,
ename string,
job string,
mgr int,
hiredate string, 
sal double, 
comm double,
deptno int)
row format delimited fields terminated by '\\t';

创建成功
在这里插入图片描述

  • 导入数据
load data local inpath '/opt/module/datatest/dept.txt' 
into table dept;

load data local inpath '/opt/modul/datatest/emp.txt'
into table emp;

2.全表查询

--查询所有内容
select * from emp;
--根据字段查询所有内容
select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp ;

结果如下:
在这里插入图片描述

3.选择特定的列进行查询

--只选择其中两列
 select empno, ename from emp;

结果如下:
在这里插入图片描述

4.列别名

重命名一列,便于计算

--将列名重命名
 select ename AS name, deptno dn from emp;

结果如下:
在这里插入图片描述

4.算数运算

运算符描述
A+BA 和 B 相加
A-BA 减去 B
A*BA 和 B 相乘
A/BA 除以 B
A%BA 对 B 取余
A&BA 和 B 按位取与
A1BA 和 B 按位取或
A^BA 和 B 按位取异或
~AA 按位取反
--所有员工薪水加100
select sal+100 from emp;

在这里插入图片描述

5.常用函数

5.1 求总行数count

 select count(*) cnt from emp;

5.2 求最大或最小值max min

--max
select max(sal) max_sal from emp;
--min
select min(sal) min_sal from emp;

5.3 求总和sum

select sum(sal) sum_sal from emp;

5.4 求平均值avg

 select avg(sal) avg_sal from emp;

6.限制返回结果的行数limit

典型的查询会返回多行数据。LIMIT 子句用于限制返回的行数。

--只输出5行
select * from emp limit 5;

7.过滤语句where

WHERE 子句紧随 FROM 子句,先执行FROM后执行WHERE最后执行select

--查询出薪水大于 1000 的所有员工
select * from emp where sal >1000;

结果如下:
在这里插入图片描述

8.比较运算符(Between/In/ Is Null)

操作符支持的数据类型描述
A=B基本数据类型如果 A 等于 B 则返回 TRUE,反之返回 FALSE
A<=>B基本数据类型如果 A 和 B 都为 NULL,则返回 TRUE,如果一边为 NULL,返回 False
A<>B A!=B基本数据类型A 或者 B 为 NULL 则返回 NULL;如果 A 不等于 B,则返回TRUE,反之返回 FALSE
A<B基本数据类型A 或者 B 为 NULL,则返回 NULL;如果 A 小于 B,则返回TRUE,反之返回 FALSE
A<=B基本数据类型A 或者 B 为 NULL,则返回 NULL;如果 A 小于等于 B,则返回 TRUE,反之返回 FALSE
A>B基本数据类型A 或者 B 为 NULL,则返回 NULL;如果 A 大于 B,则返回TRUE,反之返回 FALSE
A>=B基本数据类型A 或者 B 为 NULL,则返回 NULL;如果 A 大于等于 B,则返回 TRUE,反之返回 FALSE
A [NOT] BETWEEN B AND C基本数据类型如果 A,B 或者 C 任一为 NULL,则结果为 NULL。如果 A 的值大于等于 B 而且小于或等于 C,则结果为 TRUE,反之为 FALSE。如果使用 NOT 关键字则可达到相反的效果。
A IS NULL所有数据类型如果 A 等于 NULL,则返回 TRUE,反之返回 FALSE
A IS NOT NULL所有数据类型如果 A 不等于 NULL,则返回 TRUE,反之返回 FALSE
IN(数值 1, 数值 2)所有数据类型使用 IN 运算显示列表中的值
A [NOT] LIKE BSTRING 类型B 是一个 SQL 下的简单正则表达式,也叫通配符模式,如果A 与其匹配的话,则返回 TRUE;反之返FALSE。B 的表达式说明如下:‘x%’表示 A 必须以字母‘x’开头,‘%x’表示 A必须以字母’x’结尾,而‘%x%’表示 A 包含有字母’x’,可以位于开头,结尾或者字符串中间。如果使用 NOT 关键字则可达到相反的效果。
A RLIKE B, A REGEXP BSTRING 类型B 是基于 java 的正则表达式,如果 A 与其匹配,则返回TRUE;反之返回 FALSE。匹配使用的是 JDK 中的正则表达式接口实现的,因为正则也依据其中的规则。例如,正则表达式必须和整个字符串 A 相匹配,而不是只需与其字符串匹配。
--查询出薪水等于 5000 的所有员工
select * from emp where sal=5000;
--查询工资在 500 到 1000 的员工信息
select * from emp where sal between 500 and 1000;
--查询 comm 为空的所有员工信息
select * from emp where comm is null;
--查询工资是 1500 或 5000 的员工信息
select * from emp where comm in (1500,5000);

9.Like 和 RLike 过滤

8.1 Like选择类似值

使用 LIKE 运算选择类似的值,% 代表零个或多个字符(任意个字符); _ 代表一个字符。

--查找名字以 A 开头的员工信息
select * from emp where ename like 'A%';
--查找名字中第二个字母为 A 的员工信息
select * from emp where ename like '_A%'; 

8.1 RLike选择类似值

RLIKE 子句是 Hive 中这个功能的一个扩展,其可以通过 Java 的正则表达式这个更强大的语言来指定匹配条件.

--查找名字中带有 A 的员工信息
select * from emp where ename RLIKE '[A]';

10.逻辑运算符(And/Or/Not)

操作符含义
AND逻辑并
OR逻辑或
NOT逻辑否
--
查询薪水大于 1000,部门是 30
select * from emp where sal>1000 and deptno=30;
--查询薪水大于 1000,或者部门是 30
select * from emp where sal>1000 or deptno=30;
--查询除了 20 部门和 30 部门以外的员工信息
select * from emp where deptno not in (20,30);

11.Group By 分组

GROUP BY 语句通常会和聚合函数一起使用,按照一个或者多个列队结果进行分组,然后对每个组执行聚合操作。

--计算 emp 表每个部门的平均工资
select deptno avg(sal) from emp group by deptno;
--求平均薪水大于 2000 的部门
select deptno,avg(sal) avg_sal
from emp 
group by deptno 
having avg_sal>2000;

结果如下:
在这里插入图片描述

参考资料

《大数据Hadoop3.X分布式处理实战》

以上是关于Hadoop之Hive查询语句的主要内容,如果未能解决你的问题,请参考以下文章

Hadoop之Hive的分区表

Hadoop之Hive的排序

Hadoop之Hive(调优篇)

Hadoop之Hive(调优篇)

技术贴hadoop之hive数据仓库的常用语句,请随时翻阅

hive连接远程hadoop使用查询语句时,发生错误