• hive笔记(五):查询、排序-join语句/连接/分区/sort by/distribute by/cluster by


    目录

    查询

    Join语句

    等值Join

    表的别名

    内连接

    左外连接

    右外连接

    满外连接

    多表连接

    笛卡尔集

    排序

    全局排序

    按照别名排序

    多个列排序

    reduce内部排序(sort by)

    分区(distribute by)

    cluster by


    查询

    (1)数据准备

    dept.txt

    1. 10 ACCOUNTING 1700
    2. 20 RESEARCH 1800
    3. 30 SALES 1900
    4. 40 OPERATIONS 1700

    emp.txt

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

    (2)建表

    dept

    1. create table if not exists dept(
    2. deptno int,
    3. dname string,
    4. loc int)
    5. row format delimited fields terminated by ' ';

    emp

    1. create table if not exists emp(
    2. empno int,
    3. ename string,
    4. job string,
    5. mgr int,
    6. hiredate string,
    7. sal double,
    8. comm double,
    9. deptno int)
    10. row format delimited fields terminated by ' ';

    (3)导入数据

    1. #dept
    2. load data local inpath '/root/datas/dept.txt' into table dept;
    3. #emp
    4. load data local inpath '/root/datas/emp.txt' into table emp;

    Join语句

    等值Join

    hive支持通常的SQL JOIN语句。

    例子:根据员工表和部门表中的部门编号相等,查询员工编号、员工名称和部门名称

    1. select e.empno, e.ename, d.deptno, d.dname from emp e
    2. join dept d on e.deptno = d.deptno;

    表的别名

    使用别名可以简化查询;使用表名前缀可以提高执行效率。

    1. select e.empno, e.ename, d.deptno, d.dname
    2. from emp e join dept d on e.deptno = d.deptno;

    内连接

    进行连接的两个表中都存在与连接条件相匹配的数据。

    1. select e.empno, e.ename, d.deptno from emp e join dept d
    2. on e.deptno = d.deptno;

    左外连接

    JOIN操作符左边表中符合WHERE子句的所有记录会被返回。

    1. select e.empno, e.ename, d.deptno from emp e left join dept d
    2. on e.deptno = d.deptno;

     

    右外连接

    JOIN操作符右边表中符合WHERE子句的所有记录会被返回。

    1. select e.empno, e.ename, d.deptno from emp e right join dept d
    2. on e.deptno = d.deptno;

    满外连接

    返回所有表中符合WHERE语句条件的所有记录。如果任一表的指定字段没有符合条件的值,就使用NULL值替代。

    1. select e.empno, e.ename, d.deptno from emp e full join dept d
    2. on e.deptno = d.deptno;

    多表连接

    (1)准备数据

    location.txt

    1. 1700 Beijing
    2. 1800 London
    3. 1900 Tokyo

    (2)建表

    1. create table if not exists location(
    2. loc int,
    3. loc_name string)
    4. row format delimited fields terminated by ' ';

    (3)加载数据

    load data local inpath '/root/datas/location.txt' into table location;

    (4)多表连接

    1. select e.ename,d.dname,l.loc_name from emp e join dept d on d.deptno=e.deptno
    2. join location l on d.loc=l.loc;

     注:连接n个表,至少需要n-1个连接条件;

    例如:连接三个表,至少需要两个连接条件。

    大多数情况下,Hive会对每对JOIN连接对象启动一个MapReduce任务。

    Hive总是从左到右顺序执行,第一个MapReduce job对表e和表d进行连接操作,再启动一个MapReduce job将表d和表l进行连接操作

    优化:当对3个或者更多表进行join连接时,如果每个on子句都使用相同的连接键的,那么只会产生一个MapReduce job

    笛卡尔集

    (1)笛卡尔集会在下面条件下产生:

    1)省略连接条件;

    2)连接条件无效;

    3)所有表中的所有行互相连接;

    例子:

    select empno,dname from emp,dept;

    排序

    全局排序

    order by:全局排序,只有一个reducer;

    ASC(ascend):升序(默认);

    DESC(descend):降序;

    order by子句在select语句结尾。

    例子:

    查询员工信息(按工资升序排序)

    select * from emp order by sal;

    查询员工信息(按工资降序排序) 

    select * from emp order by sal desc;

    按照别名排序

    例子:按照工资2倍排序

    select ename,sal*2 twosal from emp order by twosal;

    多个列排序

    例子:按照部门和工资升序排序

    select ename,deptno,sal from emp order by deptno,sal;

    reduce内部排序(sort by)

    对于大规模的数据集order by的效率较低,不需要全局排序;

    sort by:为每一个reducer产生一个排序文件,每个reducer内部进行排序,对全局结果集来说不是排序。

    1. #设置reduce个数
    2. set mapreduce.job.reduces=3;
    3. #查看设置reduce个数
    4. set mapreduce.job.reduces;
    5. #根据部门编号降序查看员工信息
    6. select * from emp sort by deptno desc;
    7. #将查询结果导入到文件中(按照部门编号降序排序)
    8. insert overwrite local directory '/root/datas/sortby'
    9. select * from emp sort by deptno desc;

     

     

    分区(distribute by)

    (1)distribute by类似MR的自定义分区(partition)进行分区,结合sort by使用;

    (2)测试distribute by要分配多个reducer进行处理,不然无法看到distribute by的效果;

     例子:先按照部门号进行分区,再按照员工编号降序排序

    select * from emp distribute by deptno sort by empno desc;

     注:

    distribute by的分区规则是根据分区字段的hash码与reduce的个数进行模除后,余数相同的分到一个区。

    hive要求distribute by语句要写在sort by语句之前。

    cluster by

    cluster by:具有distribute by和sort by的功能。但是排序只能是升序排序。

    1. select * from emp cluster by deptno;
    2. select * from emp distribute by deptno sort by deptno;

    本文仅仅是学习笔记!!!

  • 相关阅读:
    星环效果css备忘
    算法-3.无重复字符的最长子串
    【C++】教大家在七夕new一个对象
    芯片制造过程2
    【每日一题】只出现一次的数字 II
    接口测试框架:Http+Requests(1)
    【StoneDB Class】入门第三课:StoneDB的编译安装
    Nacos整合OpenFegin实现RPC调用
    ArcGIS 10.7软件安装包下载及安装教程!
    算法---分割字符串的方案数
  • 原文地址:https://blog.csdn.net/qq_55906442/article/details/126527807