当前位置:   article > 正文

HIVE简单数据查询

HIVE简单数据查询

HIVE简单数据查询


1.where


    WHERE + 过滤条件  
        between/  in /  is NULL / IS NOT NULL / > < = ! ...
        如果多个存在多个过滤条件 可以用 AND OR 进行条件关联  或者是用NOT 进行条件结果取反

2.JOIN


    JOIN 内连接  左外连接  右外连接      自连接  满连接
 

创建部门表:
create table learn2.emp(
    EMPNO int
    ,ENAME string
    ,JOB string
    ,MGR int
    ,HIREDATE string
    ,SAL int
    ,BONUS int
    ,DEPTNO int

row format delimited
fields terminated by ',';

load data local inpath "/usr/local/soft/hive-3.1.2/data/emp.txt" into table learn2.emp;

创建部门表:
create table learn2.dept(
    DEPTNO int
    ,DEPTNAME string
    ,DEPTADDR string

row format delimited
fields terminated by ',';
load data local inpath "/usr/local/soft/hive-3.1.2/data/dept.txt" into table learn2.dept;

1)内连接

注意:关联时一定要跟上关联条件

select t1.ename,t2.deptno,t2.deptname from learn2.emp t1 join learn2.dept t2 on t1.deptno=t2.deptno;

2)左外连接

select t1.ename,t2.deptno,t2.deptname from learn2.emp t1 left join learn2.dept t2 on t1.deptno=t2.deptno;

3)右外连接

select t1.ename,t2.deptno,t2.deptname from learn2.emp t1 right join learn2.dept t2 on t1.deptno=t2.deptno;

  1. select count(t1.ename) numeber,t1.deptno from emp t1 group by t1.deptno;
  2. select count(1) numeber,t1.deptno from emp t1 group by t1.deptno;

3.排序

1)order by 

  1. select t1.deptno,t1.sal from emp t1 order by t1.sal;
  2. select t1.deptno,t1.sal from emp t1 order by t1.sal desc; 倒序

通过查看MAPREDUCE日志 可以看到 Reduce: 1  ORDER BY 中默认的reduce数量只能为1
    那么为什么Reduce数量只有一个
        在实际处理数据过程中,要尽量避免使用全局排序

**** set mapreduce.job.reduces; 表示查看当前reduce数量
**** set mapreduce.job.reduces = 3;表示设置当前reduce数量为3

2)sort by 

select t1.ename,t1.sal from emp t1 sort by t1.sal desc;

通过设置reduce数量为3 查询出的整体结果为乱序 局部为倒序 

导出一下数据

通过输出的结果中三个文件可以看出 sort by 是分区内有序

3)多字段排序

1)order by 多字段排序
select t1.deptno,t1.sal from emp t1 order by t1.deptno,t1.sal desc;

2)sortby 多字段排序
select t1.deptno,t1.sal from emp t1 sort by t1.deptno,t1.sal desc;

-- 结果也是分区间无序,分区内有序

4)distribute by + sort by

搭配使用进行排序
    distribute by:指定按某列数据进行分区操作,和之前MR学习中的自定义分区类似

  1. select t1.deptno,t1.sal from emp t1 sort by t1.sal desc;
  2. select t1.deptno,t1.sal from emp t1 distribute by t1.deptno sort by t1.sal desc;

5) cluster by

也表示排序操作 但是不能对数据做倒序, cluster by 表示对一个列数据进行分区排序

cluster by = distribute by + sort by

SELECT
T1.SAL
FROM learn2.emp T1 cluster by T1.SAL ;
+---------+
| t1.sal  |
+---------+
| 300     |
| 1500    |
| 2850    |
| 3000    |
| 3000    |
| 1300    |
| 1600    |
| 800     |
| 950     |
| 1100    |
| 1250    |
| 1250    |
| 2450    |
| 2975    |
| 5000    |


SELECT
T1.SAL
FROM learn2.emp T1 distribute by T1.SAL  SORT BY T1.SAL;

+---------+
| t1.sal  |
+---------+
| 300     |
| 1500    |
| 2850    |
| 3000    |
| 3000    |
| 1300    |
| 1600    |
| 800     |
| 950     |
| 1100    |
| 1250    |
| 1250    |
| 2450    |
| 2975    |
| 5000    |
+---------+

4.去重

select distinct t1.deptno from emp t1;

5.分桶操作

1)创建分桶表

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name
     [(col_name data_type [COMMENT col_comment], ...)]
    [CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]

--根据 给定的列进行 分桶排序 指定存入 N 个桶中

-- 需求:
    将bucket.txt中的数据分成4个桶进行存储

  1. CREATE TABLE IF NOT EXISTS learn2.bucket_table(
  2. id int,name STRING
  3. )
  4. CLUSTERED BY(id) INTO 4 BUCKETS
  5. ROW FORMAT DELIMITED FIELDS TERMINATED BY ",";

2)插入数据

load data local inpath "/usr/local/soft/hive-3.1.2/data/bucket.txt" into table learn2.bucket_table;

我们在插入数据时 出现了报错信息

所以 我们要开启分桶操作


--启用桶表
set hive.enforce.bucketing=true;
--限制对桶表进行load操作
set hive.strict.checks.bucketing = false;

如果加载数据的时候提示文件不存在,那么可以将数据先上传至HDFS,

之后再去加载数据至表中,同时需要开启桶表的支持,对桶表的load操作
    dfs -put /usr/local/soft/hive-3.1.2/data/bucket.txt  /data/

再次运行发现还是会报错 我们将Reduce数量设置为-1

load data inpath "/data/bucket.txt" into table learn2.bucket_table;


    通过查看表对应HDFS上的路径 可以看到数据分为4分,这样有什么好处?

    通过查看000000_0文件数据可以看到,ID列中对4取余都为0


    通过查看000001_0文件数据可以看到,ID列中对4取余都为1

    这样我们后面去表中取数据,如果对id进行过滤,如下SQL语句
    SELECT * FROM learn2.bucket_table WHERE id in ('4','1');
    那么它的执行逻辑为: 对需要查找的 id ('4','1') 进行取余,
        如果余数为0那么就去000000_0文件中加载数据 
        如果余数为1那么就去000001_0文件中加载数据 


    这样就可以避免加载不必要的数据,提高执行效率

    2> 查看桶的数量
    DESC FORMATTED learn2.bucket_table; 中的 Num Buckets: 4 参数查看具体对应的桶数

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/568633
推荐阅读
相关标签
  

闽ICP备14008679号