大数据学习之Hive——06Hive常用查询函数

一. case when 函数

1. 语法

--Case函数:
--有两种格式:
--     1.简单Case函数。
--     2.Case搜索函数。
--1.简单Case函数:
--    CASE [COLUMN_NAME] 
--        WHEN ['条件参数'] THEN ['COLUMN_NAME/显示内容']
--        WHEN ['条件参数'] THEN ['COLUMN_NAME/显示内容']
--        ......
--        ELSE ['COLUMN_NAME/显示内容']
--        END
--2.Case搜索函数:
--    CASE WHEN [COLUMN_NAME] = ['COLUMN_NAME/显示内容/表达式'] THEN [''COLUMN_NAME/显示内容'']
--         WHEN [COLUMN_NAME] = ['COLUMN_NAME/显示内容/表达式'] THEN [''COLUMN_NAME/显示内容'']
--         ......
--         ELSE ['COLUMN_NAME/显示内容']
--         END
--说明:两种方式可以实现相同的功能。简单CASE函数较CASE搜索函数语法简洁,但功能方面有所限制。
--比如说写判断式。同时还需要注意一点:CASE函数只返回第一个符合条件的值,剩下达到CASE部分将会被自动忽略。
--另外:使用CASE()函数一方面可以在查询时灵活的组织语法结构,另外一方面可以避免对同一张或多张表的多次访问。
--重点说明:ELSE可以没有。
--EG:

2. 相关练习

1. 问题1
  1. 问题: 求出不同部门男女各多少人。

  2. 数据集:

    name	dept_id		sex
    悟空    		A       男
    大海    		A       男
    宋宋    		B       男
    凤姐    		A       女
    婷姐    		B       女
    婷婷    		B       女
    
  3. 结果

    A	2	1
    B	1	2
    
  4. SQL语句

    hive > select dept_id,
    	 > sum(case sex when '男' then 1 else 0 end),
    	 > sum(case sex when '女' then 1 else 0 end)
    	 > from emp_sex group by dept_id;
    
    

二. 行转列

1. 相关函数

  1. CONCAT(string A/col, string B/col…):
    返回输入字符串连接后的结果,支持任意个输入字符串;
  2. CONCAT_WS(separator, str1, str2,…):
    它是一个特殊形式的 CONCAT()。第一个参数剩余参数间的分隔符。分隔符可以是与剩余参数一样的字符串。如果分隔符是 NULL,返回值也将为 NULL。这个函数会跳过分隔符参数后的任何 NULL 和空字符串。分隔符将被加到被连接的字符串之间;
  3. COLLECT_SET(col):
    函数只接受基本数据类型,它的主要作用是将某字段的值进行去重汇总,产生array类型字段

2. 相关练习

1. 练习1
  1. 问题: 把星座和血型一样的人归类到一起

  2. 数据集

    name	constellation	blood_type
    孙悟空		白羊座			A
    大海			射手座			A
    宋宋	    	白羊座			B	
    猪八戒   	白羊座			A
    凤姐	    	射手座			A
    
  3. 结果:

    1. 第一步: 将constellation 和 blood_type字段拼接在一起

      hive > select name, 
      	 # concat(): 返回输入字符串连接后的结果,支持任意个输入字符串;
      	 > concat(constellation, ",", blood_type)  base
      	 > from person_info;
      

      大数据学习之Hive——06Hive常用查询函数_第1张图片 2. 将base字段相同的分在一起

      hive > select t1.base, collect_set(t1.name) 
      	 > from (
      	 > select name, concat(constellation, ",", blood_type) base 
      	 > from person_info) t1 
      	 > group by t1.base;
      

      在这里插入图片描述

    2. 按照指定字符进行切分

      hive > select t1.base, 
      	 > concat_ws("|", collect_set(t1.name)) name
           > from (
           > select name, concat(constellation, ",", blood_type) base 
           > from person_info) t1
           > group by t1.base;
      
      

      在这里插入图片描述

三. 列转行

1. 相关函数说明

  1. EXPLODE(col):将hive一列中复杂的array或者map结构拆分成多行。
  2. LATERAL VIEW
  • 用法:LATERAL VIEW udtf(expression) tableAlias AS columnAlias
  • 解释:用于和split, explode等UDTF一起使用,它能够将一列数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。

2. 相关练习

1. 练习1
  1. 将电影分类中的数组数据展开

  2. 数据集

    《疑犯追踪》	悬疑,动作,科幻,剧情
    《Lie to me》	悬疑,警匪,动作,心理,剧情
    《战狼2》	战争,动作,灾难
    
  3. 结果

    hive > select movie, category_name 
    	 > from movie_info 
    	 > lateral view explode(category) table_tmp 
    	 > as category_name;
    

    大数据学习之Hive——06Hive常用查询函数_第2张图片

四. 窗口函数(开窗函数)

1. 相关函数说明

  1. OVER():指定分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变而变化。

    1.CURRENT ROW:当前行
    2.n PRECEDING:往前n行数据
    3.n FOLLOWING:往后n行数据
    4.UNBOUNDED:起点,

    • UNBOUNDED PRECEDING 表示从前面的起点,
    • UNBOUNDED FOLLOWING表示到后面的终点

    5.LAG(col,n,default_val):往前第n行数据
    6.LEAD(col,n, default_val):往后第n行数据
    7.NTILE(n):把有序分区中的行分发到指定数据的组中,各个组有编号,编号从1开始,对于每一行,NTILE返回此行所属的组的编号。注意:n必须为int类型。

2. 相关练习

1. 练习1
  1. 问题

    1. 查询在2017年4月份购买过的顾客及总人数
    2. 查询顾客的购买明细及月购买总额
    3. 上述的场景, 将每个顾客的cost按照日期进行累加
    4. 查询每个顾客上次的购买时间
    5. 查询前20%时间的订单信息
  2. 数据集

    jack,2017-01-01,10
    tony,2017-01-02,15
    jack,2017-02-03,23
    tony,2017-01-04,29
    jack,2017-01-05,46
    jack,2017-04-06,42
    tony,2017-01-07,50
    jack,2017-01-08,55
    mart,2017-04-08,62
    mart,2017-04-09,68
    neil,2017-05-10,12
    mart,2017-04-11,75
    neil,2017-06-12,80
    mart,2017-04-13,94
    
    
  3. SQL语句

    1. 查询在2017年4月份购买过的顾客及总人数

      hive> select name, count(*) over ()
          > from business
          > where substring(orderdate, 1, 7) = '2017-04'
          > group by name;
      
      

      在这里插入图片描述

    2. 查询顾客的购买明细及月购买总额

      hive> select name, orderdate, cost, sum(cost)
          > over(partition by month(orderdate)) 
          > from business;
      
      

      大数据学习之Hive——06Hive常用查询函数_第3张图片

    3. 上述的场景, 将每个顾客的cost按照日期进行累加

      1. 所有行相加

        hive> select name, orderdate, cost, sum(cost) over() as sample1 from business;
        

        大数据学习之Hive——06Hive常用查询函数_第4张图片

      2. 按name分组,组内数据相加

        partition by name: 按name进行分组

        hive> select name, orderdate, cost, sum(cost) 
        	> over(partition by name) as sample2 from business;
        

        大数据学习之Hive——06Hive常用查询函数_第5张图片

      3. 按name分组,由起点到当前行的聚合(默认)

        hive> select name, orderdate, cost, sum(cost) 
        	> over(partition by name order by orderdate) 
        	> as sample3 from business;
        

        大数据学习之Hive——06Hive常用查询函数_第6张图片

      4. 由起点到当前行的聚合(和3一样)

        UNBOUNDED PRECEDING: 前面的起点
        current row: 当前行
        between UNBOUNDED PRECEDING and current row: 首行到当前行进行累加

        hive> select name, orderdate, cost, sum(cost) 
        	> over(partition by name order by orderdate rows between UNBOUNDED PRECEDING and current row) 
        	> as sample4 from business;
        

        大数据学习之Hive——06Hive常用查询函数_第7张图片

      5. 当前行和前面一行做聚合

        n PRECEDING: 往前n行的数据
        between 1 PRECEDING and current row: 前一行和当前行做聚合

        hive> select name, orderdate, cost, sum(cost) 
        	> over(partition by name order by orderdate rows between 1 PRECEDING and current row) 
        	> as sample5 from business;
        

        大数据学习之Hive——06Hive常用查询函数_第8张图片

      6. 当前行和前边一行及后面一行做聚合

        n FOLLOWING: 往后n行数据
        between n PRECEDING and n FOLLOWING: 当前行和前边n行及后面n行做聚合

        hive> select name, orderdate, cost, sum(cost) 
        	> over(partition by name order by orderdate rows between 1 PRECEDING and 1 FOLLOWING) 
        	> as sample6 from business;
        

        大数据学习之Hive——06Hive常用查询函数_第9张图片

      7. 当前行及后面所有行

        UNBOUNDED FOLLOWING: 表示到后面的终点

        hive> select name, orderdate, cost, sum(cost) 
        	> over(partition by name order by orderdate rows between current row and UNBOUNDED FOLLOWING) 
        	> as sample7 from business;
        

        大数据学习之Hive——06Hive常用查询函数_第10张图片

      8. 综合

        hive> select name, orderdate, cost,
            > sum(cost) over() as sample1, 
            > sum(cost) over(partition by name) as sample2,
            > sum(cost) over(partition by name order by orderdate) as sample3,
            > sum(cost) over(partition by name order by orderdate rows between UNB
        OUNDED PRECEDING and current row) as sample4,    
        	> sum(cost) over(partition by name order by orderdate rows between 1 P
        RECEDING and current row) as sample5,    
        	> sum(cost) over(partition by name order by orderdate rows between 1 P
        RECEDING and 1 FOLLOWING) as sample6,    
        	> sum(cost) over(partition by name order by orderdate rows between cur
        rent row and UNBOUNDED FOLLOWING) as sample7   
        	> from business;
        
        

        大数据学习之Hive——06Hive常用查询函数_第11张图片

    4. 查询每个顾客上次的购买时间

      思路:

      1. 按姓名分组并按照时间进行排序
      2. 然后获取前一条数据和前两条数据
      3. 如果前一条数据不存在, 则取"1900-01-01"
      hive> select name, orderdate, cost, 
      	> lag(orderdate, 1, "1900-01-01") 
      	> over(partition by name order by orderdate) as time1, 
      	> lag(orderdate, 2) 
      	> over(partition by name order by orderdate) as time2 
      	> from business;
      

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