【大数据Hive】hive 行列转换使用详解

目录

一、前言

二、使用场景介绍

2.1 使用场景1

2.2 使用场景2

三、多行转多列

3.1 case when 函数

语法一

语法二

操作演示

3.2 多行转多列操作演示

四、多行转单列

4.1 concat函数

语法

4.2 concat_ws函数

语法

4.3 collect_list函数

语法

4.4 collect_set函数

语法

4.5 多行转多列操作演示

五、多列转多行

5.1 union

语法

5.2 union all

语法

5.3 多列转多行操作演示

六、单列转多行

6.1 explode函数

语法

6.2 单列转多行操作演示

七、写在文末


一、前言

在某些场景下,对于mysql表来说,要想完整的呈现出一个主体字段的所有属性,可能需要查询多条数据行,显然从msyql扫描数据行数来说,需要扫描多行才能加载出来,有没有一种办法,可以在一行记录中就呈现出所有的属性值呢?这就是所谓的行转列了。

二、使用场景介绍

2.1 使用场景1

如下图所示

 小tips:

 SqlServer和Orcle中可以使用pivot行转列函数快速实现,而MySQL中没有,还记得mysql中要实现行列转换是怎么实现的吗?

 

2.2 使用场景2

比如说,需要统计得到网站的每个小时的UV、PV、IP的个数,需要通过左边的原始数据得到右边的表结构,才能通过图形渲染出UV,PV在不同的时间段内的变化趋势图,同时来说,得到右边结构的数据之后,从查询来看,为了得到某个指标,只需要查询一行数据即可;

三、多行转多列

需求:如下,左边为原始的表数据,为了得到右边的数据,显然可以认为是将现有的多行多列数据转为一个新的多行多列数据,根据col1字段做了一个分组;

实现多行转多列的一个重要解决办法就是使用case when 函数(mysql的实现思路也是如此);

3.1 case when 函数

功能 :用于实现对数据的判断,根据条件,不同的情况返回不同的结果,类似于Java中的switch case 

语法一

CASE

WHEN 条件1 THEN VALUE1

……

WHEN 条件N THEN VALUEN

ELSE 默认值  END

语法二

CASE 列

WHEN V1 THEN VALUE1

……

WHEN VN THEN VALUEN

ELSE 默认值  END

操作演示

使用之前的一张表做测试,表中数据如下

case when 语法1

selectid,casewhen id < 2 then 'a'when id = 2 then 'b'else 'c'end as caseName
from tb_url;

执行结果

case when 语法2

selectid,case idwhen 1 then 'a'when 2 then 'b'else 'c'end as caseName
from tb_url;

执行结果

3.2 多行转多列操作演示

建表并加载数据

--建表
create table row2col1(col1 string,col2 string,col3 int
) row format delimited fields terminated by '\t';
--加载数据到表中
load data local inpath '/usr/local/soft/selectdata/r2c1.txt' into table row2col1;

执行过程

查询数据是否加载成功

最终的sql实现

selectcol1 as col1,max(case col2 when 'c' then col3 else 0 end) as c,max(case col2 when 'd' then col3 else 0 end) as d,max(case col2 when 'e' then col3 else 0 end) as e
fromrow2col1
group bycol1;

执行上面的sql观察结果,这样就得到了预期的数据展示;

四、多行转单列

原始需求,如下图,左边为原始表数据,分析来看,该表的数据第一列+第二列进行分组的话,正好可以分在一组中,第三列单独可以列出,这样的话,为了减少查询时数据扫描的行数,就可以转成右图中的数据表;

 为了实现这个需求,需要再次了解下面几个hive中关于数据拼接的函数

4.1 concat函数

 用于实现字符串拼接,不可指定分隔符,如果其中任意一个元素为null,结果就为null

语法

concat(element1,element2,element3……)

操作演示

4.2 concat_ws函数

用于实现字符串拼接,可以指定分隔符,如果其中任意一个元素不为null,结果就不为null

语法

concat_ws(SplitChar,element1,element2……)

操作演示

4.3 collect_list函数

用于将一列中的多行合并为一行,不进行去重(可以保留重复的数据)

语法

collect_list(colName)

操作演示

4.4 collect_set函数

用于将一列中的多行合并为一行,并进行去重(注意:这个与collect_list形成了对比)

语法

collect_set(colName)

操作演示

4.5 多行转多列操作演示

建表并加载数据

--建表
create table row2col2(col1 string,col2 string,col3 int
)row format delimited fields terminated by '\t';--加载数据到表中
load data local inpath '/usr/local/soft/selectdata/r2c2.txt' into table row2col2;

执行完成后查询数据

sql实现思路

1、根据col1和col2进行分组;

2、使用collect_list将col3的数据组合在一起;

3、最后使用concat_ws将数据进行拼接;

完整的实现sql如下

selectcol1,col2,concat_ws(',', collect_list(cast(col3 as string))) as col3
fromrow2col2
group bycol1, col2;

执行结果如下

五、多列转多行

需求场景,如下图所示,左表为原始数据,a,b有3个属性字段,限现在需要将其转为多行进行展示,即每个属性值单列为一行记录,即上述多行转多列的颠倒;

多列转多行的实现需要 union 关键字进行转换,关于union 下面做简单的说明

5.1 union

将多个select语句结果合并为一个,且结果去重且排序

语法

select_statement 
UNION [DISTINCT] 
select_statement 
UNION [DISTINCT] 
select_statement ...

 操作演示

select 'b','a','c'
union
select 'a','b','c'
union
select 'a','b','c';

执行结果

5.2 union all

将多个select语句结果合并为一个,且结果不去重不排序

语法

select_statement UNION ALL select_statement UNION ALL select_statement ...

操作演示

select 'b','a','c' 
union all 
select 'a','b','c' 
union all  
select 'a','b','c';

 执行结果

5.3 多列转多行操作演示

创建表并加载数据

create table col2row1
(col1 string,col2 int,col3 int,col4 int
) row format delimited fields terminated by '\t';--加载数据
load data local inpath '/usr/local/soft/selectdata/c2r1.txt'  into table col2row1;

查询数据是否加载成功

最终实现sql

select col1, 'c' as col2, col2 as col3 from col2row1
UNION ALL
select col1, 'd' as col2, col3 as col3 from col2row1
UNION ALL
select col1, 'e' as col2, col4 as col3 from col2row1;

执行结果如下

六、单列转多行

需求场景,将左表的数据,根据col3进行拆分为多行,展示成右边的数据表,这个正好和上面的多行转单列反过来;

 多列转多行的实现需要用到explode函数,该函数在之前的文章中也谈到过,这里再做一下补充说明;

6.1 explode函数

用于将一个集合或者数组中的每个元素展开,将每个元素变成一行

语法

explode( Map | Array)

操作演示

select explode(split("a,b,c,d",","));

执行结果

6.2 单列转多行操作演示

建表并加载数据

--创建表
create table col2row2(col1 string,col2 string,col3 string
)row format delimited fields terminated by '\t';--加载数据
load data local inpath '/root/hivedata/c2r2.txt' into table col2row2;

执行过程

查询数据是否加载成功

 

使用explode函数查询一下col3

select explode(split(col3,',')) from col2row2;

执行结果

最终的sql实现

selectcol1,col2,lv.col3 as col3
fromcol2row2lateral viewexplode(split(col3, ',')) lv as col3;

执行结果

七、写在文末

本文通过操作案例详细介绍了hive中行列转换的使用,在实际工作中,行列转换可以说使用的场景很多,有必要理解和掌握,本篇到此结束,感谢观看。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/242106.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【51单片机Keil+Proteus8.9】控制步进电机+LCD1602显示状态

步进电机控制 设计思路 电路设计&#xff1a; 选用AT89C51单片机作为电路核心部件&#xff0c;外加LM016L液晶显示屏作为显示&#xff0c;显示步进电机的Fast&#xff0c;Slow&#xff0c;Stop的三个状态将AT89C51单片机所选引脚与LM016L控制引脚相连&#xff0c;再将数据通…

龙芯+RT-Thread+LVGL实战笔记(30)——电子琴演奏

【写在前面】正值期末,笔者工作繁忙,因此本系列教程的更新频率有所放缓,还望订阅本专栏的朋友理解,请勿催更。笔者在此也简要声明几点: 有些硬件模块笔者并没有,如LED点阵、压力传感模块、RFID模块等,因此这些模块的相关任务暂时无法给出经过验证的代码。其实,教程进行…

微电网优化MATLAB:遗传算法(Genetic Algorithm,GA)求解微电网优化(提供MATLAB代码)

一、微网系统运行优化模型 微电网优化是指通过对微电网系统中各个组件的运行状态进行监测和调节&#xff0c;以实现微电网系统的高效运行和能源利用的最大化。微电网是由多种能源资源&#xff08;如太阳能、风能、储能等&#xff09;和负载&#xff08;如建筑、工业设备等&…

什么是技术架构?架构和框架之间的区别是什么?怎样去做好架构设计?(二)

什么是技术架构?架构和框架之间的区别是什么?怎样去做好架构设计?(二)。 技术架构是对某一技术问题(需求)解决方案的结构化描述,由构成解决方案的组件结构及之间的交互关系构成。广义上的技术架构是一系列涵盖多类技术问题设计方案的统称,例如部署方案、存储方案、缓存…

接口测试遇到500报错?别慌,你的头部可能有点问题

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

C#,入门教程(38)——大型工程软件中类(class)修饰词partial的使用方法

上一篇&#xff1a; C#&#xff0c;入门教程(37)——优秀程序员的修炼之道https://blog.csdn.net/beijinghorn/article/details/125011644 一、大型&#xff08;工程应用&#xff09;软件倚重 partial 先说说大型&#xff08;工程应用&#xff09;软件对源代码的文件及函数“…

NFS网络共享存储服务技术攻略

目录 一.NFS 1.定义 2.特点 3.原理 二.服务端NFS配置文件 1.主配置文件 2.文件格式 3.相关命令 三.实验&#xff1a;NFS共享存储服务配置 1.服务端安装nfs-utils和rpcbind软件包 2.服务端新建共享目录给权限 3.服务端修改配置文件/etc/exports 4.服务端关闭防火墙…

HTTP 协议和 TCP/IP 协议之间有什么区别?

HTTP&#xff08;超文本传输协议&#xff09;和TCP/IP&#xff08;传输控制协议/互联网协议&#xff09;是两种在互联网通信中广泛使用的协议&#xff0c;它们之间的区别和联系对许多人来说可能还不是很清晰&#xff0c;今天我们就带大家来一起了解一下HTTP和TCP/IP协议这2者之…

【C++】vector容器接口要点的补充

接口缩容 在VS编译器的模式下&#xff0c;类似于erase和insert接口的函数通常会进行缩容&#xff0c;因此&#xff0c;insert和erase行参中的迭代器可能会失效。下图中以erase为例&#xff1a; 代码如下&#xff1a; #include <iostream> #include <vector> #inclu…

虚拟机安装宝塔的坑

问题&#xff1a; 在虚拟机中centos7和centos8中安装宝塔之后&#xff0c;无法访问面板。 解决&#xff1a; 1.先关闭防火墙&#xff08;如果本机能够ping通相关端口&#xff0c;则不用关闭防火墙&#xff09; 2.最新的宝塔会自动开启ssl协议&#xff0c;需要手动关闭。…

UE5 蓝图编辑美化学习

虚幻引擎中干净整洁蓝图的15个提示_哔哩哔哩_bilibili 1.双击线段成节点。 好用&#xff0c;爱用 2.用序列节点 好用&#xff0c;爱用 3.用枚举。 好用&#xff0c;能避免一些的拼写错误 4.对齐节点 两点一水平线 5.节点上下贴节点 &#xff08;以前不懂&#xff0c;现在经常…

Node.js基础知识点(四)

本节介绍一下最简单的http服务 一.http 可以使用Node 非常轻松的构建一个web服务器&#xff0c;在 Node 中专门提供了一个核心模块&#xff1a;http http 这个模块的就可以帮你创建编写服务器。 1. 加载 http 核心模块 var http require(http) 2. 使用 http.createServe…

new Handler(getMainLooper())与new Handler()的区别

Handler 在Android中是一种消息处理机制。 new Handler(); 创建handler对象&#xff0c;常用在已经初始化了 Looper 的线程中调用这个构造函数&#xff08;即非主线程&#xff09;&#xff0c;如果感觉不好理解&#xff0c;可以把Handler handler new Handler() 理解为常用在…

C和指针课后答案

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 第八章课后答案 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参…

SpringMVC-.xml的配置

文章目录 一、对pom.xml的配置二、对web.xml1.第一种方式2. 第二种方式 三、对SpringMVC.xml的配置 一、对pom.xml的配置 <!-- 打包成war包--><packaging>war</packaging> <dependencies><!-- SpringMVC--><dependency><gro…

Idea 开发环境不断切换git代码分支导致冲掉别人代码

问题分析 使用git reflog查看执行命令&#xff0c;以下是发生事故的切换和提交动作 46f72622e1 HEAD{41}: commit: feat: 【Sales - 6.3】小程序端不登录也可以录入客户线索 c5e7d9f6e1 HEAD{42}: fetch origin feature/20240102_Sales6.3_xingang:feature/20240102_Sales6.3…

芯品荟 | 电脑机箱键盘副屏市场调研报告

一.产品简介 1.带TFT彩屏电脑机箱 2.带小TFT彩屏电脑键盘 为什么电脑机箱&键盘&#xff0c;要带屏&#xff1f; 带屏的电脑机箱&键盘客户群体? 电竞玩家、设计师、电子发烧友、股民...... 二、市场规模 中国电脑机箱年产量约6000万台&#xff0c;键盘年产量约3亿…

探索世界,从一款好用的浏览器开始!

好用的浏览器分享 在这个数字化的时代&#xff0c;浏览器已经成为了我们生活中不可或缺的工具。从浏览新闻、社交媒体到工作学习&#xff0c;我们几乎无时无刻不在与浏览器打交道。那么&#xff0c;如何选择一款好用的浏览器呢&#xff1f;今天&#xff0c;我就来为大家分享几…

2024-01-15(SpringMVCMybatis)

1.拦截器&#xff1a;如果我们想在多个handler方法(controller中的方法)执行之前或者之后都进行一些处理&#xff0c;甚至某些情况下需要拦截掉&#xff0c;不让handler方法执行&#xff0c;那么就可以使用SpringMVC为我们提供的拦截器。 拦截器和过滤器的区别&#xff1a;过滤…

2023.12 电子学会青少年软件编程(Python) 等级考试试卷(三级)

2023年12月 电子学会青少年软件编程&#xff08;Python&#xff09; 等级考试试卷&#xff08;三级&#xff09; 分数&#xff1a; 100 题数&#xff1a; 38 一、单选题(共 25 题&#xff0c; 共 50 分) 1. 一个非零的二进制正整数&#xff0c; 在其末尾添加两个“0” &#xf…