06、Hive 实战 - Hive查询之基本查询

1. 全表和特定列查询

1.1. 数据准备

1)原始数据如下所示,在服务器上创建对应的文件,然后导入数据即可

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	ALLEN	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

2)创建部门表

create table if not exists dept(
    deptno int,
    dname string,
    loc int
)
row format delimited fields terminated by '\t';

3)创建员工表

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';

4)导入数据

load data local inpath '/opt/module/datas/dept.txt' into table dept;
load data local inpath '/opt/module/datas/emp.txt' into table emp;

1.2. 全表查询

hive (default)> select * from emp;
hive (default)> select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp ;

1.3. 选择特定列查询

hive (default)> select empno, ename from emp;

注意:

SQL 语言大小写不敏感。 SQL 可以写在一行或者多行 关键字不能被缩写也不能分行 各子句一般要分行写。 使用缩进提高语句的可读性。

2. 列别名

1)重命名一个列 2)便于计算 3)紧跟列名,也可以在列名和别名之间加入关键字‘AS’ 4)案例实操:查询名称和部门

hive (default)> select ename AS name, deptno dn from emp;

3. 算术运算符

运算符 描述
A+B A和B 相加
A-B A减去B
A*B A和B 相乘
A/B A除以B
A%B A对B取余
A&B A和B按位取与
A|B A和B按位取或
A^B A和B按位取异或
~A A按位取反

案例实操:查询出所有员工的薪水后加1显示。

hive (default)> select sal +1 from emp;

4. 常用函数

  • 求总行数(count):
hive (default)> select count(*) cnt from emp;
  • 求最大值(max):
hive (default)> select max(sal) max_sal from emp;
  • 求最小值(min):
hive (default)> select min(sal) min_sal from emp;
  • 求总和(sum):
hive (default)> select sum(sal) sum_sal from emp; 
  • 求平均值(avg):
hive (default)> select avg(sal) avg_sal from emp;

5. Limit语句

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

hive (default)> select * from emp limit 5;
hive (default)> select * from emp limit 2;

6. Where语句

使用WHERE子句,将不满足条件的行过滤掉,WHERE子句紧随FROM子句

hive (default)> select * from emp where sal >1000;

注意:where子句中不能使用字段别名。

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

下面表中描述了谓词操作符,这些操作符同样可以用于JOIN…ON和HAVING语句中。

操作符 支持的数据类型 描述
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的所有员工
hive (default)> select * from emp where sal =5000;
  • 查询工资在500到1000的员工信息
hive (default)> select * from emp where sal between 500 and 1000;
  • 查询comm为空的所有员工信息
hive (default)> select * from emp where comm is null;
  • 查询工资是1500或5000的员工信息
hive (default)> select * from emp where sal IN (1500, 5000);

8. Like和RLike

  • 使用LIKE运算选择类似的值
  • 选择条件可以包含字符或数字

%代表零个或多个字符(任意个字符)。
_ 代表一个字符。

  • RLIKE子句

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

  • 案例实操

(1)查找名字以A开头的员工信息

hive (default)> select * from emp where ename LIKE 'A%';

(2)查找名字中第二个字母为A的员工信息

hive (default)> select * from emp where ename LIKE '_A%';

(3)查找名字中带有A的员工信息

hive (default)> select * from emp where ename  RLIKE '[A]';

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

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