• hive笔记(七):函数-内置函数/空字段赋值/行转列/列转行/窗口函数/Rank


    目录

    函数

    系统内置函数

    常用内置函数

    空字段赋值

    CASE WHEN THEN ELSE END

    行转列

    列转行

    窗口函数

    Rank


    函数

    系统内置函数

    (1)查看系统自带函数

    show functions;

    (2)显示自带函数的用法

    desc function if;

    (3)详细显示自带函数的用法

    desc function extended if;

    常用内置函数

    空字段赋值

    (1)说明

    赋值,它的格式是NVL(valuedefault_value)。功能是如果valueNULL,则NVL函数返回default_value的值,否则返回value的值,如果都为NULL ,则返回NULL。

    (2)准数据备

    查看前面内容!

    (3)查询

    NVL(valuedefault_value)

    1)comm为null,default_value为-1

    select comm,nvl(comm,-1) from emp;

     

     2)comm为null,default_value为领导id

    select comm,nvl(comm,mgr) from emp;

    CASE WHEN THEN ELSE END

    1)准备数据

    emp_sex.txt

    1. 悟空 A
    2. 大海 A
    3. 宋宋 B
    4. 凤姐 A
    5. 婷姐 B
    6. 婷婷 B

    建表

    1. create table emp_sex(
    2. name string,
    3. dept_id string,
    4. sex string)
    5. row format delimited fields terminated by " ";

     导入数据

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

    2)查询:求出不同部门男女各多少人

    1. select
    2. dept_id,
    3. sum(case sex when '男' then 1 else 0 end) male_count,
    4. sum(case sex when '女' then 1 else 0 end) female_count
    5. from emp_sex
    6. group by dept_id;

     

    行转列

    (1)相关函数说明

    CONCAT(string A/col, string B/col):返回输入字符串连接后的结果,支持任意个输入的字符串;

    CONCAT_WS(separator, str1, str2,...):它是一个特殊形式的CONCAT(),除第一个参数外剩余参 数间的分隔符,分隔符可以是与剩余参数一样的字符串;如果分隔符是NULL返回值也将为NULL。这个函数会跳过分隔符参数后的任何NULL和空字符串,分隔符将被加到被连接的字符串之间;

    注意: CONCAT_WS must be "string or array

    COLLECT_SET(col):函数只接受基本数据类型,它的主要作用是将某字段的值进行去重汇总,产生Array类型字段。

    (2)数据准备

    /root/datas/person.txt

    1. 孙悟空 白羊座 A
    2. 猪八戒 白羊座 A
    3. 牛魔王 射手座 A
    4. 白眉大王 白羊座 B
    5. 金角大王 射手座 A
    6. 哪吒 白羊座 B

    (3)创建hive表

    1. create table person(
    2. name string,
    3. constellation string,
    4. biood string)
    5. row format delimited fields terminated by " ";
    6. load data local inpath "/root/datas/person.txt" into table person;

    (4)把星座和血型一样的人归类

    1. SELECT
    2. t1.c_b,
    3. CONCAT_WS("|",collect_set(t1.name))
    4. FROM (
    5. SELECT
    6. NAME,
    7. CONCAT_WS(',',constellation,blood) c_b
    8. FROM person
    9. )t1
    10. GROUP BY t1.c_b;

     

    列转行

    (1)函数说明

    EXPLODE(col):将hive一列中复杂的Array或者Map结构拆分成多行。

    LATERAL VIEW:LATERAL VIEW udtf(expression) tableAlias AS columnAlias

    解释:用于和split, explodeUDTF一起使用,它能够将一列数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。

    (2)数据准备

    movie.txt

    1. 《杀死那个男人》 悬疑,动作,科幻,剧情
    2. 《分手那天》 悬疑,警匪,动作,心理,剧情
    3. 《笨蛋的战争》 战争,动作,灾难

    (3)创建hive表

    1. create table movie(
    2. name string,
    3. category string)
    4. row format delimited fields terminated by " ";
    5. load data local inpath "/root/datas/movie.txt" into table movie;

    (4)把电影分类中的数组展开

    select name,category from movie lateral VIEW explode(split(category,",")) movie_tmp AS category_name;

    没有拆分成功,我也不知道为什么

     

    窗口函数

    (1)函数说明

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

    CURRENT ROW:当前行;

    n PRECEDING:往前n行数据;

    n FOLLOWING:往后n行数据;

    UNBOUNDED:起点;

    UNBOUNDED PRECEDING:表示从前面的起点;

    UNBOUNDED FOLLOWING:表示到后面的终点;

    LAG(col,n,default_val):往前第n行数据;

    LEAD(col,n, default_val):往后第n行数据;

    NTILE(n):把有序窗口的行分发到指定数据的组中,各个组有编号,编号从1开始,对于每一行,NTILE返回此行所属的组的编号。注意:n必须为int类型。

    (2)窗口函数

    business.txt

    1. jack,2022-08-01,10
    2. tony,2022-08-02,15
    3. jack,2022-08-03,23
    4. tony,2022-08-04,29
    5. jack,2022-08-05,46
    6. jack,2022-09-06,42
    7. tony,2022-09-07,50
    8. jack,2022-08-08,55
    9. mart,2022-08-08,62
    10. mart,2022-08-09,68
    11. neil,2022-09-10,12
    12. mart,2022-09-11,75
    13. neil,2022-09-12,80
    14. mart,2022-09-13,94

    (3)创建hive数据表

    1. create table business(
    2. name string,
    3. cost_date string,
    4. cost string)
    5. row format delimited fields terminated by ",";
    6. load data local inpath "/root/datas/business.txt" into table business;

    (4)查询在2022年8月购买的顾客及人数

    1. select name,count(*) over() from business
    2. where substring(cost_date,1,7)='2022-08'
    3. group by name;

     

    (5)查询顾客购买明细及月购买总额

    1. select name,cost_date,cost,sum(cost)
    2. over(partition by month(cost_date)) from business;

     

     

    (6)将每一个顾客的cost按照日期进行累加

    1. select name,cost_date,cost,sum(cost) over() as sample1,
    2. sum(cost) over(partition by name) as sample2,
    3. sum(cost) over(partition by name order by cost_date) as sample3,
    4. sum(cost) over(partition by name order by cost_date rows between UNBOUNDED PRECEDING and current row) as sample4
    5. from business;

     sample1:所有行相加;

    sample2:按照name进行分组,组内数据进行相加;

    sample3:按照name进行分组,组内数据累加;

    sample4:按照name进行分组,组内数据累加(另一个方法);

     

    1. select name,cost_date,cost,sum(cost) over(partition by name order by cost_date rows between 1 PRECEDING and current row) as sample5,
    2. sum(cost) over(partition by name order by cost_date rows between 1 PRECEDING and 1 FOLLOWING) as sample6,
    3. sum(cost) over(partition by name order by cost_date rows between current row and UNBOUNDED FOLLOWING) as sample7 from business;

    sample5:当前行和前面行做聚合;

    sample6:当前行与前面一行和后面一行做聚合;

    sample7:当前行和后面所有行做聚合; 

     

     

    (7)查看上次购买时间

    1. select name,cost_date,cost,
    2. lag(cost_date,1,'2022-07-30') over(partition by name order by cost_date) as time1,
    3. lag(cost_date,2) over(partition by name order by cost_date) as time2
    4. from business;

     

    (8)查看前20%时间的订单信息

    1. select * from (select name,cost_date,cost,ntile(5)
    2. over(order by cost_date)sorted from business) t where sorted = 1;

     

    (9) 查看前50%时间的订单信息

    1. select * from (select name,cost_date,cost,ntile(2)
    2. over(order by cost_date)sorted from business) t where sorted = 1;

     

    Rank

    (1)函数说明

    RANK() :排序相同时会重复,总数不会变;

    DENSE_RANK(): 排序相同时会重复,总数会减少;

    ROW_NUMBER() :会根据顺序计算;

    (2)数据准备

    score.txt

    1. 孙悟空 语文 87
    2. 孙悟空 数学 95
    3. 孙悟空 英语 68
    4. 猪八戒 语文 94
    5. 猪八戒 数学 56
    6. 猪八戒 英语 84
    7. 沙和尚 语文 64
    8. 沙和尚 数学 86
    9. 沙和尚 英语 84
    10. 唐僧 语文 65
    11. 唐僧 数学 85
    12. 唐僧 英语 78

    (3)创建hive数据表

    1. create table score(
    2. name string,
    3. subject string,
    4. score string)
    5. row format delimited fields terminated by " ";
    6. load data local inpath "/root/datas/score.txt" into table score;

    (4)计算每门学科成绩排名

    1. select name,subject,score,rank() over(partition by subject order by score desc) rp,
    2. dense_rank() over(partition by subject order by score desc) drp,
    3. row_number() over(partition by subject order by score desc) rmp
    4. from score;

    本文为学习笔记!!!

  • 相关阅读:
    NetworkManager 图形化配置 bond
    Java零基础入门-位运算符
    大数据:数据策略之CAP理论和BASE理论
    CGAL AABB树
    这年头谁还不会抓包,WireShark 抓包及常用协议分析送给你
    导航 习题【微机原理】【习题】
    猿创征文|我的十二年的运维之路
    资源预测数字模型搭建思路分享
    Spring源码——Bean完整的生命周期详解
    Python 依赖管理及打包三方库 Poetry
  • 原文地址:https://blog.csdn.net/qq_55906442/article/details/126577696