Hadoop之Hive查询语句

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

学习目录

    • 1.数据准备
    • 2.全表查询
    • 3.选择特定的列进行查询
    • 4.列别名
    • 4.算数运算
    • 5.常用函数
      • 5.1 求总行数count
      • 5.2 求最大或最小值max min
      • 5.3 求总和sum
      • 5.4 求平均值avg
    • 6.限制返回结果的行数limit
    • 7.过滤语句where
    • 8.比较运算符(Between/In/ Is Null)
    • 9.Like 和 RLike 过滤
      • 8.1 Like选择类似值
      • 8.1 RLike选择类似值
    • 10.逻辑运算符(And/Or/Not)
    • 11.Group By 分组
    • 参考资料

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

数据创建成功
Hadoop之Hive查询语句_第1张图片

  • 创建表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';

创建成功
Hadoop之Hive查询语句_第2张图片

  • 导入数据
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 ;

结果如下:
Hadoop之Hive查询语句_第3张图片

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

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

结果如下:
Hadoop之Hive查询语句_第4张图片

4.列别名

重命名一列,便于计算

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

结果如下:
Hadoop之Hive查询语句_第5张图片

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;

Hadoop之Hive查询语句_第6张图片

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;

结果如下:
Hadoop之Hive查询语句_第7张图片

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 基本数据类型 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;

结果如下:
Hadoop之Hive查询语句_第8张图片

参考资料

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

你可能感兴趣的:(Hadoop,hive,大数据,hadoop)