大数据技术之Hive5

本文涉及的产品
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
简介: 大数据技术之Hive5

8.2.5 流程控制函数

1)case when:条件判断函数

语法一:case when a then b [when c then d]* [else e] end


返回值:T


说明:如果a为true,则返回b;如果c为true,则返回d;否则返回 e


hive> select case when 1=2 then 'tom' when 2=2 then 'mary' else 'tim' end from tableName;


mary


语法二: case a when b then c [when d then e]* [else f] end


返回值: T


说明:如果a等于b,那么返回c;如果a等于d,那么返回e;否则返回f


hive> select case 100 when 50 then 'tom' when 100 then 'mary' else 'tim' end from t ableName;


mary


2)if: 条件判断,类似于Java中三元运算符


语法:if(boolean testCondition, T valueTrue, T valueFalseOrNull)


返回值:T


说明:当条件testCondition为true时,返回valueTrue;否则返回valueFalseOrNull


(1)条件满足,输出正确


hive> select if(10 > 5,'正确','错误');


输出:正确


(2)条件满足,输出错误


hive> select if(10 < 5,'正确','错误');


输出:错误


8.2.6 集合函数

1)size:集合中元素的个数

hive> select size(friends) from test; --2/2 每一行数据中的friends集合里的个数

2)map:创建map集合

语法:map (key1, value1, key2, value2, …)


说明:根据输入的key和value对构建map类型


案例实操:


hive> select map('xiaohai',1,'dahai',2);


输出:


hive> {"xiaohai":1,"dahai":2}


3)map_keys: 返回map中的key


hive> select map_keys(map('xiaohai',1,'dahai',2));


输出:


hive>["xiaohai","dahai"]


4)map_values: 返回map中的value


hive> select map_values(map('xiaohai',1,'dahai',2));


输出:


hive>[1,2]


5)array 声明array集合


语法:array(val1, val2, …)


说明:根据输入的参数构建数组array类


案例实操:


hive> select array('1','2','3','4');


输出:


hive>["1","2","3","4"]


6)array_contains: 判断array中是否包含某个元素


hive> select array_contains(array('a','b','c','d'),'a');


输出:


hive> true


7)sort_array:将array中的元素排序


hive> select sort_array(array('a','d','c'));


输出:


hive> ["a","c","d"]


8)struct声明struct中的各属性


语法:struct(val1, val2, val3, …)


说明:根据输入的参数构建结构体struct类


案例实操:


hive> select struct('name','age','weight');


输出:


hive> {"col1":"name","col2":"age","col3":"weight"}


9)named_struct声明struct的属性和值


hive> select named_struct('name','xiaosong','age',18,'weight',80);


输出:


hive> {"name":"xiaosong","age":18,"weight":80}


8.2.7 案例演示

1. 数据准备

1)表结构

1686573558366.png

2)建表语句


hive>


create table employee(


name string, --姓名


sex string, --性别


birthday string, --出生年月


hiredate string, --入职日期


job string, --岗位


salary double, --薪资


bonus double, --奖金


friends array<string>, --朋友


children map<string,int> --孩子


)


3)插入数据


hive> insert into employee


values('张无忌','男','1980/02/12','2022/08/09','销售',3000,12000,array('阿朱','小昭'),map('张小无',8,'张小忌',9)),


('赵敏','女','1982/05/18','2022/09/10','行政',9000,2000,array('阿三','阿四'),map('赵小敏',8)),


('宋青书','男','1981/03/15','2022/04/09','研发',18000,1000,array('王五','赵六'),map('宋小青',7,'宋小书',5)),


('周芷若','女','1981/03/17','2022/04/10','研发',18000,1000,array('王五','赵六'),map('宋小青',7,'宋小书',5)),


('郭靖','男','1985/03/11','2022/07/19','销售',2000,13000,array('南帝','北丐'),map('郭芙',5,'郭襄',4)),


('黄蓉','女','1982/12/13','2022/06/11','行政',12000,null,array('东邪','西毒'),map('郭芙',5,'郭襄',4)),


('杨过','男','1988/01/30','2022/08/13','前台',5000,null,array('郭靖','黄蓉'),map('杨小过',2)),


('小龙女','女','1985/02/12','2022/09/24','前台',6000,null,array('张三','李四'),map('杨小过',2))


2. 需求

1)统计每个月的入职人数

(1)期望结果


month

cnt

4

2

6

1

7

1

8

2

9

2

(2)需求实现


select


month(replace(hiredate,'/','-')) as month,


count(*) as cn


from


employee


group by


month(replace(hiredate,'/','-'))


2)查询每个人的年龄(年+ 月)

(1)期望结果

name

age

张无忌

42年8月

赵敏

40年5月

宋青书

41年7月

周芷若

41年7月

郭靖

37年7月

黄蓉

39年10月

杨过

34年9月

小龙女

37年8月


(2)需求实现

-- 转换日期

select
name,
replace(birthday,'/','-') birthday
from
employee t1
-- 求出年和月
select
name,
year(current_date())-year(t1.birthday) year,
month(current_date())-month(t1.birthday) month
from
(
select
name,
replace(birthday,'/','-') birthday
from
employee
)t1 t2
-- 根据月份正负决定年龄
select
name,
concat(if(month>=0,year,year-1),'年',if(month>=0,month,12+month),'月') age
from
(
select
name,
year(current_date())-year(t1.birthday) year,
month(current_date())-month(t1.birthday) month
from
(
select
name,
replace(birthday,'/','-') birthday
from
employee
)t1
)t2

3)按照薪资,奖金的和进行倒序排序,如果奖金为null,置位0

(1)期望结果

name

sal

周芷若

19000

宋青书

19000

郭靖

15000

张无忌

15000

黄蓉

12000

赵敏

11000

小龙女

6000

杨过

5000

(2)需求实现

select

name,

salary + nvl(bonus,0) sal

from

employee

order by

sal desc


4)查询每个人有多少个朋友

(1)期望结果

name

cnt

张无忌

2

赵敏

2

宋青书

2

周芷若

2

郭靖

2

黄蓉

2

杨过

2

小龙女

2

(2)需求实现

select

name,

size(friends) cnt

from

employee;


5)查询每个人的孩子的姓名

(1)期望结果

name

ch_name

张无忌

["张小无","张小忌"]

赵敏

["赵小敏"]

宋青书

["宋小青","宋小书"]

周芷若

["宋小青","宋小书"]

郭靖

["郭芙","郭襄"]

黄蓉

["郭芙","郭襄"]

杨过

["杨小过"]

小龙女

["杨小过"]


(2)需求实现

hive>

select

name,

map_keys(children) ch_name

from

employee;


6)查询每个岗位男女各多少人

(1)期望结果

job

male

female

前台

1

1

研发

1

1

行政

0

2

销售

2

0


(2)需求实现

select
job,
sum(if(sex='男',1,0)) male,
sum(if(sex='女',1,0)) female
from
employee
group by
job

*8.3 高级聚合函数

多进一出(多行传入,一个行输出)。

1)普通聚合 count/sum.... 见第6章 6.2.4

2)collect_list 收集并形成list集合,结果不去重

ive>

select

sex,

collect_list(job)

from

employee

group by

sex

结果:

女 ["行政","研发","行政","前台"]

男 ["销售","研发","销售","前台"]


3)collect_set 收集并形成set集合,结果去重

hive>

select

sex,

collect_set(job)

from

employee

group by

sex

结果:

女 ["行政","研发","前台"]

男 ["销售","研发","前台"]


8.3.1 案例演示

1)每个月的入职人数以及姓名

hive>
select
month(replace(hiredate,'/','-')) as month,
count(*) as cn,
Collect_list(name) as name_list
from
employee
group by
month(replace(hiredate,'/','-'))
结果:
month cn name_list
4 2 ["宋青书","周芷若"]
6 1 ["黄蓉"]
7 1 ["郭靖"]
8 2 ["张无忌","杨过"]
9 2 ["赵敏","小龙女"]

8.4 炸裂函数

8.4.1 概述

8.4.2 案例演示

1.数据准备

1)表结构


movie

category

《疑犯追踪》

悬疑,动作,科幻,剧情

《Lie to me》

悬疑,警匪,动作,心理,剧情

《战狼2》

战争,动作,灾难


2)建表语句

1. hive (hive (default)>
create table movie_info(
    movie string,     --电影名称
    category string   --电影分类
) 
row format delimited fields terminated by "\t";

3)装载语句

insert overwrite table movie_info
values ("《疑犯追踪》", "悬疑,动作,科幻,剧情"),
       ("《Lie to me》", "悬疑,警匪,动作,心理,剧情"),
       ("《战狼2》", "战争,动作,灾难");

2. 需求

1)需求说明

根据上述电影信息表,统计各分类的电影数量,期望结果如下:

剧情

2

动作

3

心理

1

悬疑

2

战争

1

灾难

1

科幻

1

警匪

1


2)答案

select
    cate,
    count(*)
from
(
    select
        movie,
        cate
    from
    (
        select
            movie,
            split(category,',') cates
        from movie_info
    )t1 lateral view explode(cates) tmp as cate
)t2
group by cate;

*8.5 窗口函数(开窗函数)

8.5.1 概述

8.5.2 常用窗口函数

按照功能,常用窗口可划分为如下几类:聚合函数、跨行取值函数、排名函数。

1)聚合函数

max:最大值。

min:最小值。

sum:求和。

avg:平均值。

count:计数。

2)跨行取值函数

(1)lead和lag

注:lag和lead函数不支持自定义窗口。

(2)first_value和last_value

3)排名函数

注:rank 、dense_rank、row_number不支持自定义窗口。

*8.5.3 案例演示

1.数据准备

1)表结构

1686573813022.png

2)建表语句


create table order_info


(


order_id string, --订单id


user_id string, -- 用户id


user_name string, -- 用户姓名


order_date string, -- 下单日期


order_amount int -- 订单金额


);

3)装载语句


insert overwrite table order_info


values ('1', '1001', '小元', '2022-01-01', '10'),


('2', '1002', '小海', '2022-01-02', '15'),


('3', '1001', '小元', '2022-02-03', '23'),


('4', '1002', '小海', '2022-01-04', '29'),


('5', '1001', '小元', '2022-01-05', '46'),


('6', '1001', '小元', '2022-04-06', '42'),


('7', '1002', '小海', '2022-01-07', '50'),


('8', '1001', '小元', '2022-01-08', '50'),


('9', '1003', '小辉', '2022-04-08', '62'),


('10', '1003', '小辉', '2022-04-09', '62'),


('11', '1004', '小猛', '2022-05-10', '12'),


('12', '1003', '小辉', '2022-04-11', '75'),


('13', '1004', '小猛', '2022-06-12', '80'),


('14', '1003', '小辉', '2022-04-13', '94');


2. 需求

1)统计每个用户截至每次下单的累积下单总额

(1)期望结果

1686573842497.png1686573847912.png

(2)需求实现

select


order_id,


user_id,


user_name,


order_date,


order_amount,


sum(order_amount) over(partition by user_id order by order_date rows between unbounded preceding and current row) sum_so_far


from order_info;


2)统计每个用户截至每次下单的当月累积下单总额

(1)期望结果

1686573876285.png1686573881018.png

(2)需求实现


select


order_id,


user_id,


user_name,


order_date,


order_amount,


sum(order_amount) over(partition by user_id,substring(order_date,1,7) order by order_date rows between unbounded preceding and current row) sum_so_far


from order_info;


3)统计每个用户每次下单距离上次下单相隔的天数(首次下单按0天算)

(1)期望结果

1686573906578.png1686573913245.png

(2)需求实现


select


order_id,


user_id,


user_name,


order_date,


order_amount,


nvl(datediff(order_date,last_order_date),0) diff


from


(


select


order_id,


user_id,


user_name,


order_date,


order_amount,


lag(order_date,1,null) over(partition by user_id order by order_date) last_order_date


from order_info


)t1


4)查询所有下单记录以及每个用户的每个下单记录所在月份的首/末次下单日期


(1)期望结果

1686573939320.png

1686573943774.png(2)需求实现


select


order_id,


user_id,


user_name,


order_date,


order_amount,


first_value(order_date) over(partition by user_id,substring(order_date,1,7) order by order_date) first_date,


last_value(order_date) over(partition by user_id,substring(order_date,1,7) order by order_date rows between unbounded preceding and unbounded following) last_date


from order_info;



相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps&nbsp;
目录
相关文章
|
26天前
|
存储 机器学习/深度学习 分布式计算
大数据技术——解锁数据的力量,引领未来趋势
【10月更文挑战第5天】大数据技术——解锁数据的力量,引领未来趋势
|
13天前
|
存储 分布式计算 数据可视化
大数据常用技术与工具
【10月更文挑战第16天】
55 4
|
26天前
|
存储 数据采集 监控
大数据技术:开启智能决策与创新服务的新纪元
【10月更文挑战第5天】大数据技术:开启智能决策与创新服务的新纪元
|
2天前
|
消息中间件 分布式计算 大数据
数据为王:大数据处理与分析技术在企业决策中的力量
【10月更文挑战第29天】在信息爆炸的时代,大数据处理与分析技术为企业提供了前所未有的洞察力和决策支持。本文探讨了大数据技术在企业决策中的重要性和实际应用,包括数据的力量、实时分析、数据驱动的决策以及数据安全与隐私保护。通过这些技术,企业能够从海量数据中提取有价值的信息,预测市场趋势,优化业务流程,从而在竞争中占据优势。
20 1
|
4天前
|
存储 分布式计算 Hadoop
数据湖技术:Hadoop与Spark在大数据处理中的协同作用
【10月更文挑战第27天】在大数据时代,数据湖技术凭借其灵活性和成本效益成为企业存储和分析大规模异构数据的首选。Hadoop和Spark作为数据湖技术的核心组件,通过HDFS存储数据和Spark进行高效计算,实现了数据处理的优化。本文探讨了Hadoop与Spark的最佳实践,包括数据存储、处理、安全和可视化等方面,展示了它们在实际应用中的协同效应。
23 2
|
5天前
|
存储 分布式计算 Hadoop
数据湖技术:Hadoop与Spark在大数据处理中的协同作用
【10月更文挑战第26天】本文详细探讨了Hadoop与Spark在大数据处理中的协同作用,通过具体案例展示了两者的最佳实践。Hadoop的HDFS和MapReduce负责数据存储和预处理,确保高可靠性和容错性;Spark则凭借其高性能和丰富的API,进行深度分析和机器学习,实现高效的批处理和实时处理。
21 1
|
26天前
|
存储 分布式计算 druid
大数据-149 Apache Druid 基本介绍 技术特点 应用场景
大数据-149 Apache Druid 基本介绍 技术特点 应用场景
50 1
大数据-149 Apache Druid 基本介绍 技术特点 应用场景
|
2月前
|
机器学习/深度学习 运维 分布式计算
大数据技术专业就业前景
大数据技术专业就业前景广阔,广泛应用于互联网、金融、医疗等众多行业,助力企业数字化转型。岗位涵盖大数据开发、分析、运维及管理,如大数据工程师、分析师和系统运维工程师等。这些岗位因专业性和稀缺性而享有优厚薪资,尤其在一线城市可达20万至50万年薪。随着技术进步和经验积累,从业者可晋升为高级职位或投身数据咨询、创业等领域,发展空间巨大。
49 5
|
2月前
|
人工智能 编解码 搜索推荐
大模型、大数据与显示技术深度融合 加速智慧医疗多元化场景落地
大模型、大数据与显示技术深度融合 加速智慧医疗多元化场景落地
|
26天前
|
存储 数据采集 分布式计算
大数据技术:开启智能时代的新引擎
【10月更文挑战第5天】大数据技术:开启智能时代的新引擎