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+B | A 和 B 相加 |
A-B | A 减去 B |
A*B | A 和 B 相乘 |
A/B | A 除以 B |
A%B | A 对 B 取余 |
A&B | A 和 B 按位取与 |
A1B | A 和 B 按位取或 |
A^B | A 和 B 按位取异或 |
~A | A 按位取反 |
--所有员工薪水加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 B | STRING 类型 | B 是一个 SQL 下的简单正则表达式,也叫通配符模式,如果A 与其匹配的话,则返回 TRUE;反之返FALSE。B 的表达式说明如下:‘x%’表示 A 必须以字母‘x’开头,‘%x’表示 A必须以字母’x’结尾,而‘%x%’表示 A 包含有字母’x’,可以位于开头,结尾或者字符串中间。如果使用 NOT 关键字则可达到相反的效果。 |
A RLIKE B, A REGEXP B | STRING 类型 | 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查询语句的主要内容,如果未能解决你的问题,请参考以下文章