在实际使用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的行列转换(行转多列、多列转行、行转单列、单列转行)相关推荐

  1. [数据库] SQL查询语句表行列转换及一行数据转换成两列

    本文主要讲述了SQL查询语句表之间的行列转换,同时也包括如何将一行数据转换成两列数据的方法.子查询的应用.decode函数的用法.希望文章对你有所帮助~ 1.创建数据库表及插入数据 2.子查询统计不同 ...

  2. 大数据之hive:行列转换系列总结

    目录 1.行转列(一) 主要使用: 示例 2.列转行(一) 示例 3.行转列(二) 示例 4.列转行(二) 示例 1.行转列(一) 主要使用: CONCAT(string A/col, string ...

  3. Hive行列转换使用

    Hive典型应用场景之行列转换 在使用Hive处理数据时,经常遇到行列转换的场景,本文将对Hive的行列转换操作做详细的说明.行转列 1)多行转多列 假设数据表 row2col:col1 col2 c ...

  4. SQL ON Hadoop-Hive(六)-字符串函数+行列转换

    一.hive常用字符串函数 1.字符串反转函数reverse(string A) --返回值类型stringselect reverse('gian') from iteblog; --'naig'2 ...

  5. Oracle 行列转换总结

    行列转换包括以下六种情况: *列转行 *行转列 *多列转换成字符串 *多行转换成字符串 *字符串转换成多列 *字符串转换成多行 下面分别进行举例介绍. 首先声明一点,有些例子需要如下10g及以后才有的 ...

  6. oracle行列转换总结

    最近论坛很多人提的问题都与行列转换有关系,所以我对行列转换的相关知识做了一个总结, 希望对大家有所帮助,同时有何错疏,恳请大家指出, 我也是在写作过程中学习,算是一起和大家学习吧. 行列转换包括以下六 ...

  7. SQL Server中行列转换 Pivot UnPivot (转载)

    SQL Server中行列转换 Pivot UnPivot PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现PIVOT的一般语法是:PIV ...

  8. oracle非常量不能用于privot_Oracle 行列转换函数pivot、unpivot的使用(二)

    一.行转列pivot 关键函数pivot,其用法如下 pivot(聚合函数 for 列名 in(类型)) select * from table_name pivot(max(column_name) ...

  9. 交叉表、行列转换和交叉查询经典

    交叉表.行列转换和交叉查询经典 一.什么是交叉表 "交叉表"对象是一个网格,用来根据指定的条件返回值.数据显示在压缩行和列中.这种格式易于比较数据并辨别其趋势.它由三个元素组成: ...

  10. oracle中行列转换总结

    oracle中行列转换 1.行列转换包括以下六种情况: 2. 列转行 2.1 UNION ALL 2.2 MODEL 2.3 COLLECTION 2.4 UNPIVOT 3. 行转列 3.1 AGG ...

最新文章

  1. scala的多种集合的使用(8)之队列和栈的操作方法
  2. MP3Player(附源码)
  3. AOP:【动态代理】||@Pointcut
  4. 利用图基Tukey method检测数据集中的异常值
  5. html页面源码_整合SpringMVC之错误处理底层原理及源码分析
  6. 买卖股票的最佳时机—leetcode121
  7. 洛谷P3357:最长k可重线段集问题(网络流)
  8. Beta冲刺——星期三
  9. win10, tensorflow遇到 ImportError: Could not find “cudart64_90dll” 错误解决
  10. PAT Basic 1071. 小赌怡情(15)
  11. 各尺寸学术会议海报模板[转]
  12. Git error : bad signature 0x00000000 fatal: index file corrupt
  13. 2016php开发 饱和了吗,2016PHP程序员待遇和就业前景调查
  14. Kinect v2保存图像和深度图序列
  15. python和java哪个好就业-计算机专业选Java和Python哪个前景好点?
  16. Win10 系统设置共享文件
  17. 在HTML中实现两个div并排显示
  18. springboot中使用Mybatis_plus
  19. python日历模块_Python calendar日历模块的说明
  20. 护卫神mysql初始密码_护卫神MySQL密码重置器(MySQL密码重置工具)V1.3 最新免费版...

热门文章

  1. 谷歌 AI 团队用 GAN 模型合成异形生物体
  2. Hrbust 1865 人类希望——kokoII【记忆化搜索】
  3. 设置qgraphicsitem原点_QT QGraphicsScene设置原点左下角
  4. {黑掉这个盒子} \\ FluxCapacitor Write-Up
  5. Keil 5报错error C216: subscript on non-array or too many dimensions
  6. java 主动释放_java的手动释放资源
  7. python画两条曲线_python 实现将多条曲线画在一幅图上的方法
  8. 能够在乱世中_乱世中
  9. 【Unity】OnePieceFTG(五)游戏流程
  10. 克孜勒苏柯尔克孜自治州谷歌高清卫星地图下载