Hive的行列转换(行转多列、多列转行、行转单列、单列转行)
在实际使用Hive的过程中,常常会涉及到行列转换,细分的话,有下面4种类型的行列转换,分别是:
1. 行转多列
2. 多列转行
3. 行转单列
4. 单列转行
下面我们通过样例介绍每种行列转换的实现方法。
样例表
班级成绩表:
姓名(name) | 学科(subject) | 成绩(score) |
---|---|---|
A | 语文 | 70 |
A | 数学 | 90 |
A | 英语 | 80 |
B | 数学 | 95 |
B | 英语 | 85 |
B | 语文 | 75 |
行列转换思路分析及实现
行转多列
如果需要将上面的样例表转换为
“姓名 | 语文成绩 | 数学成绩 | 英语成绩”
这样的格式,那么这就需要用到行转多列。
思路:
涉及到行转成列,肯定是会按照某一列或者某几列的值进行分组来压缩行数,所以会用到group by。
分组之后需要用到聚合函数,由于多列中的每列只关心自己对应的数据,所以要使用case语句进行选择,至于聚合函数,只要数据能保证唯一性,max、min、avg(数值类型)等都可以
样例SQL:
select name,
max(case when subject = '数学' then score else null end) math,
max(case when subject='英语' then score else null end) english,
max(case when subject='语文' then score else null end) chinese
from t1
group by name;
多列转行
将上面行转多列的结果再转回成原始表结构的过程,就是多列转行
思路
列转行,会涉及到行数的增加,所以会用到UDTF,而UDTF只是针对某一列的,要把这列扩展后生成的多行数据和源表中的各列拼接在一起,需要用到lateral view语法;
需要将多列里各列的列名(业务含义),在新数据中当做一个标识列,而与lateral view联合使用的explode函数是支持Map类型的,所以要先将原表里的多列变换成Map类型的一列,然后再用lateral view拆开。
样例SQL:
select name,subject,score from
(select name,map('数学',math,'英语',english,'语文',chinese) scoresfrom t2
) tt1
lateral view explode(scores) tt2 as subject,score;
行转单列
将原始表转换为
“姓名 | 所有科目成绩集合 ”
则涉及到行转单列
思路
和行转多列一样,行数会减少,所以需要用到group by,然后转成的是单列,所以需要用到collect_list或者collect_set聚合函数,如果字段类型想要是有分隔符隔开的字符串,再套上一层concat_ws;
上面的方案得出的array或者字符串是乱序的,如果想要进行排序,可以使用sort_array函数。但sort_array只能按字段类型的升序排列(数值字段自然序,字符串字段字典序);
如果想要自己指定排序规则,或者排序的不是单列里的这个字段(比如班级考试成绩表,所有分数字段里需要根据学科进行排序,而不是分数高低),则需要使用collect_list加上over子句来实现。
样例SQL:
1、成绩不排序
select name,concat_ws(',',collect_list(score))
from t1
group by name;
2、按分数高低排序
select name,concat_ws(',',sort_array(collect_list(score)))
from t1
group by name;
3、按学科进行排序
select name,concat_ws(',',max(a)) from
(select name,collect_list(score) over(partition by name order by subject rows between unbounded preceding and unbounded following) a from t1
) tt1 group by name;
4、按指定的学科顺序排序
select name,concat_ws(',',max(a)) scores from
(select name,collect_list(score) over(partition by name order by case when subject='语文' then 1 when subject='数学' then 2 when subject='英语' then 3 end rows between unbounded preceding and unbounded following) a from t1
) tt1 group by name;
单列转行
将上面的结果转成原始表结构,就是单列转行
思路
和多列转行一样,使用lateral view加explode来转换。但这种方式转换出来会丢失掉科目字段信息;
如果需要加上科目信息,则需要按照单列里面的顺序的业务含义,先将单列转成Map类型,将科目加到数据里,然后再使用lateral view转换。
样例SQL:
1、无科目字段
select name,score from
(select name,split(scores,',') s from t3
) tt1
lateral view explode(s) tt2 as score;
2、有科目字段
select name,subject,score from
(select name,map('语文',s[0],'数学',s[1],'英语',s[2]) ss from (select name,split(scores,',') s from t3) tt1
) ttt1
lateral view explode(ss) ttt2 as subject,score;
Hive的行列转换(行转多列、多列转行、行转单列、单列转行)相关推荐
- [数据库] SQL查询语句表行列转换及一行数据转换成两列
本文主要讲述了SQL查询语句表之间的行列转换,同时也包括如何将一行数据转换成两列数据的方法.子查询的应用.decode函数的用法.希望文章对你有所帮助~ 1.创建数据库表及插入数据 2.子查询统计不同 ...
- 大数据之hive:行列转换系列总结
目录 1.行转列(一) 主要使用: 示例 2.列转行(一) 示例 3.行转列(二) 示例 4.列转行(二) 示例 1.行转列(一) 主要使用: CONCAT(string A/col, string ...
- Hive行列转换使用
Hive典型应用场景之行列转换 在使用Hive处理数据时,经常遇到行列转换的场景,本文将对Hive的行列转换操作做详细的说明.行转列 1)多行转多列 假设数据表 row2col:col1 col2 c ...
- SQL ON Hadoop-Hive(六)-字符串函数+行列转换
一.hive常用字符串函数 1.字符串反转函数reverse(string A) --返回值类型stringselect reverse('gian') from iteblog; --'naig'2 ...
- Oracle 行列转换总结
行列转换包括以下六种情况: *列转行 *行转列 *多列转换成字符串 *多行转换成字符串 *字符串转换成多列 *字符串转换成多行 下面分别进行举例介绍. 首先声明一点,有些例子需要如下10g及以后才有的 ...
- oracle行列转换总结
最近论坛很多人提的问题都与行列转换有关系,所以我对行列转换的相关知识做了一个总结, 希望对大家有所帮助,同时有何错疏,恳请大家指出, 我也是在写作过程中学习,算是一起和大家学习吧. 行列转换包括以下六 ...
- SQL Server中行列转换 Pivot UnPivot (转载)
SQL Server中行列转换 Pivot UnPivot PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现PIVOT的一般语法是:PIV ...
- oracle非常量不能用于privot_Oracle 行列转换函数pivot、unpivot的使用(二)
一.行转列pivot 关键函数pivot,其用法如下 pivot(聚合函数 for 列名 in(类型)) select * from table_name pivot(max(column_name) ...
- 交叉表、行列转换和交叉查询经典
交叉表.行列转换和交叉查询经典 一.什么是交叉表 "交叉表"对象是一个网格,用来根据指定的条件返回值.数据显示在压缩行和列中.这种格式易于比较数据并辨别其趋势.它由三个元素组成: ...
- oracle中行列转换总结
oracle中行列转换 1.行列转换包括以下六种情况: 2. 列转行 2.1 UNION ALL 2.2 MODEL 2.3 COLLECTION 2.4 UNPIVOT 3. 行转列 3.1 AGG ...
最新文章
- scala的多种集合的使用(8)之队列和栈的操作方法
- MP3Player(附源码)
- AOP:【动态代理】||@Pointcut
- 利用图基Tukey method检测数据集中的异常值
- html页面源码_整合SpringMVC之错误处理底层原理及源码分析
- 买卖股票的最佳时机—leetcode121
- 洛谷P3357:最长k可重线段集问题(网络流)
- Beta冲刺——星期三
- win10, tensorflow遇到 ImportError: Could not find “cudart64_90dll” 错误解决
- PAT Basic 1071. 小赌怡情(15)
- 各尺寸学术会议海报模板[转]
- Git error : bad signature 0x00000000 fatal: index file corrupt
- 2016php开发 饱和了吗,2016PHP程序员待遇和就业前景调查
- Kinect v2保存图像和深度图序列
- python和java哪个好就业-计算机专业选Java和Python哪个前景好点?
- Win10 系统设置共享文件
- 在HTML中实现两个div并排显示
- springboot中使用Mybatis_plus
- python日历模块_Python calendar日历模块的说明
- 护卫神mysql初始密码_护卫神MySQL密码重置器(MySQL密码重置工具)V1.3 最新免费版...
热门文章
- 谷歌 AI 团队用 GAN 模型合成异形生物体
- Hrbust 1865 人类希望——kokoII【记忆化搜索】
- 设置qgraphicsitem原点_QT QGraphicsScene设置原点左下角
- {黑掉这个盒子} \\ FluxCapacitor Write-Up
- Keil 5报错error C216: subscript on non-array or too many dimensions
- java 主动释放_java的手动释放资源
- python画两条曲线_python 实现将多条曲线画在一幅图上的方法
- 能够在乱世中_乱世中
- 【Unity】OnePieceFTG(五)游戏流程
- 克孜勒苏柯尔克孜自治州谷歌高清卫星地图下载