hive简单数据查询、函数

一、简单数据查询

1、where

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

2、JOIN

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

    内连接:
        注意:关联时一定要跟上关联条件
SELECT  
T1.age
,T2.gender
FROM   表1  T1   JOIN   表2  T2    ON    T1.name = T2.name;   //和sql语句不同的是 表 as t1 中的as不用加

    左外连接:
SELECT  
T1.age
,T2.gender
FROM   表1   T1  LEFT JOIN   表2   T2 ON   T1.name = T2.name;


    右外连接:
SELECT  
T1.age
,T2.gender
FROM   表1   T1 RIGHT JOIN   learn2.emp   T2 ON   T1.name = T2.name;


3、GROUP BY 分组聚合

-- 统计每个部门下的员工数

select 
JOB
from learn2.emp t1 group by t1.JOB;

4、distinct 去重操作,结果与分组相同


SELECT
DISTINCT T1.JOB
FROM learn2.emp T1;  


5、排序

(1) ORDER BY 默认只能全局排序,默认正序从小到大
-- 对薪资进行倒排
SELECT
T1.ENAME
,T1.SAL
FROM learn2.emp T1 ORDER BY T1.SAL desc
    通过查看MAPREDUCE日志 可以看到 Reduce: 1  ORDER BY 中默认的reduce数量只能为1
        在实际处理数据过程中,要尽量避免使用全局排序

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

(2)sort by 可用于分区间排序,区间内有序,整体无序
SELECT
T1.ENAME
,T1.SAL
FROM learn2.emp T1 SORT BY T1.SAL desc

修改reduce数量以达到分区间排序
**** set mapreduce.job.reduces; 表示查看当前reduce数量
**** set mapreduce.job.reduces = 3;表示设置当前reduce数量为3

通过设置reduce数量为3 查询出的结果为整体乱序,但有三个区间有序

多字段排序
-- 以部门做升序,薪资做倒叙排列
SELECT
T1.DEPTNO
,T1.SAL
FROM learn2.emp T1 ORDER BY T1.DEPTNO, T1.SAL desc      加上desc表示倒叙
-- 结果也是分区间无序,分区内有序

(3)distribute by + sort by 搭配使用进行排序
    distribute by:指定按某列数据进行分区操作,例:下面就是以相同的DEPTNO为分区,有几个不同的DEPTNO,就有几个分区,然后进行分区排序

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

二、函数

1、如何查看函数

        1)SHOW FUNCTIONS 查看所有支持的函数 共289个
        2)SHOW FUNCTIONS LIKE  "**"  模糊查询函数名
        3)DESC FUNCTION + 函数名 可以查看函数的具体使用方法

2、if函数

  格式:IF(判断条件,为TRUE则返回该参数中内容,为FLASE则返回当前参数位置的内容)

        select
        T1.ename
        ,if(T1.sal > 1000 ,"高收入","低收入") as T
        from learn2.emp T1;

3、case when函数 适合多个判断

   格式:CASE WHEN 判断条件1 THEN 如果为TURE返回THEN1后的值, 
                      WHEN 判断条件2 THEN 如果为TURE返回THEN2后的值, 
                       ELSE 以上都不满足,则返回ELSE后的值
          END

        select
        T1.ename
        ,case when T1.sal > 3000 then "高收入"
         when T1.sal <=3000 and T1.sal > 1000 then "中收入"
         else "低收入" end as T
        from learn2.emp T1

4、字符串函数

字符串拼接:拼接的间隔字符位置不同
    SELECT CONCAT(T1.EMPNO,"/",T1.ENAME) FROM learn2.emp T1
    SELECT CONCAT_WS("/",CAST(T1.EMPNO AS STRING),T1.ENAME) FROM learn2.emp T1
            注:CONCAT_WS需要提供STRING类型数据,如果不满足可以通过CAST将数据类型进行转换

字符串截取函数:
            SELECT SUBSTRING(CURRENT_DATE,1,7);

切分函数:
            select split('abtcdtef','t')   返回的数据类型为复杂数据类型Array

5、with  as函数

将表存入缓存中并标记。

格式:

        WITH table1  AS  T1(
         SELECT 查询语句1
        )
        , table2 AS  T2(
         SELECT 查询语句2
        )
        SELECT   FROM   

例:

SELECT T.col,sum(T.num)
FROM (
SELECT * FROM T1
UNION ALL
SELECT * FROM T2
)T GROUP BY T.col

6、集合函数

COLLECT_LIST() 
        需要跟GROUP BY column1 配合使用,将column1中相同的组column2数据放至一个集合中
    
    COLLECT_SET()
        需要跟GROUP BY column1 配合使用,将column1中相同的组column2数据放至一个集合中,并对集合中的数据进行去重操作

--需求:
    将一列中相同的内容放至一组数据中
        将 word列中所有相同的单词对应的num 放至一个数组中


SELECT 
word
,COLLECT_LIST(num)
FROM learn3.wordcount2
GROUP BY word
+--------+------------+
|  word  |    _c1     |
+--------+------------+
| hello  | [1,2,1,2]  |
| hive   | [3,3]      |


SELECT   //结果中去重了
word
,COLLECT_SET(num)
FROM learn3.wordcount2
GROUP BY word

| hello  | [1,2]  |
| hive   | [3]    |

7、EXPLODE() 函数,将一行数据装换成多行

INSERT INTO TABLE learn3.wordcount (word) VALUES ("hello,word,hello,java,hello,spark");

插入一行数据

将集合中的一行数据以逗号隔开并转换为多行

SELECT
EXPLODE(split(word,",")) as word   
FROM learn3.wordcount

但如果要输出多列就不行了,要和LATERAL VIEW搭配使用

SELECT
movie_name,type
FROM learn3.movie LATERAL VIEW EXPLODE(split(types,"/")) view as type

解析:  
    ① 通过split方法将types中的字符串切分为数组
    ② 通过EXPLODE方法将数组由一行数据转换为多行
    ③ 通过LATERAL VIEW 将EXPLODE转换的结果包装成一个名为view的一个侧写表,并且列名为type
    ④ 通过全连接将侧写表中的数据与原表 learn3.movie 中的一行数据进行全连接 

8、窗口函数

分组排序

row_number:无并列排名 (1,2,3,4,5)

* 用法: select xxxx, row_number() over(partition by 分组字段 order by 排序字段 desc) as rn from tb group by xxxx  

 dense_rank:有并列排名,并且依次递增(1,2,2,3,3)

* 用法: select xxxx, dense_rank() over(partition by 分组字段 order by 排序字段 desc) as dr from tb group by xxxx


 rank:有并列排名,不依次递增(1,2,2,4,4)

* 用法: select xxxx, rank() over(partition by 分区字段 order by 排序字段 desc) as r from tb group by xxxx

percent_rank:[(rank的结果-1)/(分区内数据的个数-1)] 

* 用法: select xxxx, percent_rank() over(partition by 分组字段 order by 排序字段 desc) as pr from tb group by xxxx

8、max、min、avg、count、sum函数

max
    用法:
            ① max(T1.total_score) OVER(PARTITION BY T1.clazz ORDER BY T1.total_score DESC) 
                基于每个partition分区内数据取最大值
            ② max(T1.total_score) OVER() 
                基于整个数据集取最大值
min、avg(平均数)、count(计数)、sum(和):与max方法使用一致

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值