Hive学习笔记-行列互转

行转列

问题:

当某一维度或多维度组合下出现多行数据,如何将其聚合至一行进行保存?

实例:

表名:tbl_student_score
字段:stu_id:学号;stu_name:姓名;subject:学科;score:分数;

学号姓名学科分数
1001张三数学99
1001张三语文60
1001张三英语70
1002李四数学100
1002李四语文99
1002李四英语98
1003王五数学95
1003王五语文80
1003王五英语99

最终结果展示:

学号姓名学科分数
1001张三数学,语文,英语99,60,70
1002李四数学,语文,英语100,99,98
1003王五数学,语文,英语95,80,99

解决方式:

方法1:

select
	stu_id,
	stu_name,
	concat_ws(',', collect_set(subject)) as subject,
	concat_ws(',', collect_set(score)) as score
from tbl_student_score
group by
	stu_id,
	stu_name;

方法2:

select
	stu_id,
	stu_name,
	concat_ws(',', collect_list(subject)) as subject,
	concat_ws(',', collect_list(score)) as score
from tbl_student_score
group by
	stu_id,
	stu_name;

沉淀:

函数用法:

函数用法返回结果类型作用
Collect_setCollect_set(column)Array收集 group by 聚合字段,返回去重后数组(集合)
Concat_wsConcat_ws(separator, columnA, columnB,…)String以指定分隔符(separator)连接多个字符串
Collect_listCollect_list(column)Array收集 group by 聚合字段,返回不去重后数组(集合)

列转行

问题:

当某一行数据中的某一列或某些列数据聚合多个数据,如何将其拆解并分行保存?

实例:

表名:tbl_student_score_collect
字段:stu_id:学号;stu_name:姓名;subject:学科;score:分数;

学号姓名学科分数
1001张三数学,语文,英语99,60,70
1002李四数学,语文,英语100,99,98
1003王五数学,语文,英语95,80,99

最终结果展示:
结果1:

学号姓名学科
1001张三数学
1001张三语文
1001张三英语
1002李四数学
1002李四语文
1002李四英语
1003王五数学
1003王五语文
1003王五英语

结果2:

学号姓名学科分数
1001张三数学99
1001张三语文60
1001张三英语70
1002李四数学100
1002李四语文99
1002李四英语98
1003王五数学95
1003王五语文80
1003王五英语99

解决方式:

方法1:

Select
	Stu_id,
	Stu_name,
	Subject_explode
From tbl_student_score_collect
Lateral view explode(split(subject,',')) sbj as Subject_explode;

方法2:

Select
	Stu_id,
	Stu_name,
	Subject_explode,
	Score_explode
From tbl_student_score_collect
Lateral view posexplode(split(subject,',')) sbj as pos, Subject_explode
Lateral view posexplode(split(socre,',')) sc as pos, Score_explode
Where sbj.pos = sc.pos;

沉淀:

函数用法:

函数用法返回结果类型作用
ExplodeExplode(Array)String将列中复杂的array数据拆分成多行元素
PosexplodePosexplode(Array)String将列中复杂的array数据拆分成多行元素,同时返回元素在数据中的索引位置

Lateral view:

基本描述:

Lateral view一般与UDTF(用户自定义生成函数)结合使用,如,explode(),split();将UDTF应用于表中的每一行,然后将结果输出行连接到输入行,以形成具有提供表别名的虚拟表。

基本语法:
Select
	Xxx,
	Xxxx,
	ColumnAlias
From tbl_name
Lateral view udtf(expression) tableAlias AS columnAlias (',' columnAlias)*
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值