【大数据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.mzph.cn/news/636048.shtml

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

相关文章

dpwwn:02

靶场下载地址 https://download.vulnhub.com/dpwwn/dpwwn-02.zip 环境配置 当打开此虚拟机环境的时候&#xff0c;可能会出现&#xff1a;当前硬件版本不支持设备“sata”。然后启动失败的情况~ 解决办法参考&#xff1a;https://www.cnblogs.com/yaodun55/p/16434468.html …

x-cmd pkg | fanyi - 命令行中英文翻译工具

目录 简介首次用户功能特点竞品和相关作品进一步探索 简介 fanyi 是命令行翻译工具&#xff0c;翻译数据来源于 icba.com 和 fanyi.youdao.com&#xff0c;仅支持中英文互译。支持 ChatGPT&#xff0c;可通过设置 OpenAI API 密钥以启用 ChatGPT 翻译。 注意&#xff1a;在 L…

Flink SQL

Flink SQL 来源&#xff1a;B站尚硅谷 sql-client准备 Table API和SQL是最上层的API&#xff0c;在Flink中这两种API被集成在一起&#xff0c;SQL执行的对象也是Flink中的表&#xff08;Table&#xff09;&#xff0c;所以我们一般会认为它们是一体的。Flink是批流统一的处理…

本地运行LlaMA 2的简易指南

大家好&#xff0c;像LLaMA 2这样的新开源模型已经变得相当先进&#xff0c;并且可以免费使用。可以在商业上使用它们&#xff0c;也可以根据自己的数据进行微调&#xff0c;以开发专业版本。凭借其易用性&#xff0c;现在可以在自己的设备上本地运行它们。 本文将介绍如何下载…

numpy数组的max、min、argmax和argmin计算方法

numpy数组的max、min、argmax和argmin计算方法 官方对numpy.max和numpy.min的说明 numpy.max 参考官方的理解 数组&#xff1a; 24611529 import numpy as npif __name__ __main__:a np.array([[2, 4, 6, 1], [1, 5, 2, 9]])print(a)print(np.argmax(a, axis0)) # ax…

Java医院信息管理系统

技术框架&#xff1a; springboot shiro layui jquery thymeleaf nginx 有需要的可以联系我。 运行环境&#xff1a; jdk8 mysql IntelliJ IDEA maven项目功能&#xff1a; 本项目是用springbootlayuishiro写的医院管理系统&#xff0c;系统的业务比较复杂&#x…

11 - PXC集群|MySQL存储引擎

PXC集群&#xff5c;MySQL存储引擎 数据库系列文章PXC集群配置集群测试集群 MySQL存储引擎存储引擎介绍mysql服务体系结构mysql服务的工作过程处理查询访问的工作过程处理存储insert访问的工作过程 什么是搜索引擎 存储引擎管理查看存储引擎修改存储引擎 存储引擎特点myisam存储…

canvas能压缩图片?

之前写过一篇使用命令行工具压缩图片的博文&#xff1a;使用yx-tiny命令行工具进行图片压缩&#xff0c;大家感兴趣可以去瞅一眼。 这篇简单说一下使用canvas压缩图片 其实思路很简单&#xff0c;我们选择了图片之后&#xff0c;会获取到对应的文件流对象&#xff0c;然后我们…

jvm复习,深入理解java虚拟机一:运行时数据区域

程序计数器&#xff08;Program Counter Register&#xff09; 它是程序控制流的指示器&#xff0c;简单来说&#xff0c;为了线程切换后能恢复到正确的执行位置&#xff0c;每条线程都需要有一个独立的程序计数器 Java虚拟机栈&#xff08;Java Virtual Machine Stack&#xf…

【LeetCode每日一题】2809. 使数组和小于等于 x 的最少时间

2024-1-19 文章目录 [2809. 使数组和小于等于 x 的最少时间](https://leetcode.cn/problems/minimum-time-to-make-array-sum-at-most-x/)思路&#xff1a; 2809. 使数组和小于等于 x 的最少时间 思路&#xff1a; 获取两个列表的长度n&#xff0c;并初始化一个二维数组f&…

一种更快的Kmeans原理与实现

普通的k-means实现大多需要多轮迭代,一轮需要O(n * k)的复杂度,其中n是数据量,k是聚类的数量。观察到大部分地方的标准均值中的大多数距离计算都是冗余的。 所以Elkan-Kmeans通过三角不等式来优化这一过程,减少无效计算。 困难在于三角不等式给出了上界,但我们需要下界以…

我在提交代码的时候突然发现别人刚才提交了一点代码,我没有拉取导致问题,请问怎么解决

问: 回答: 问: 我跟随输入git pull ,然后又以下提示: Merge branch systemPower_dev of https://xxxx.com into xxxx_dev # Please enter a commit message to explain why this merge is necessary, # especially if it merges an updated upstream into a topic branch. …

SELF自动化指令集构建代码实现

SELF-Instruct paper: 2022.12, SELF-INSTRUCT: Aligning Language Model with Self Generated Instructions https://github.com/yizhongw/self-instruct https://github.com/tatsu-lab/stanford_alpaca#data-generation-process 一语道破天机&#xff1a;类似非线性插值&a…

plt.animation绘制动画

目录 一&#xff1a;介绍 二&#xff1a;创建线动画 一&#xff1a;介绍 matplotlib.animation 是 Matplotlib 库中的一个模块&#xff0c;用于创建动画。它提供了多种工具和函数&#xff0c;使您能够轻松地创建各种类型的动画。 二&#xff1a;创建线动画 import numpy as…

【Linux】第三十站:进程间通信

文章目录 一、是什么二、为什么三、怎么办四、管道1.什么是管道2.管道的原理3.接口4.编码实现5.管道的特征6.管道的四种情况 一、是什么 两个或者多个进程实现数据层面的交互 因为进程独立性的存在&#xff0c;导致进程通信的成本比较高 通信是有成本的&#xff0c;体现在要打破…

【禅道】的介绍及安装使用

文章目录 一、禅道入门1.1 概述1.2 特点1.2.1 私有化部署&#xff08;禅道&#xff09;&#xff1a;1.2.2 SaaS云部署&#xff08;云禅道&#xff09;&#xff1a; 1.3 安装1.4 启动禅道 二、禅道的使用2.1 编辑公司信息2.2 搭建组织架构2.2.1 创建部门2.2.2 增加员工 2.2 产品…

Solana Mobile开启第二代Saga手机预售,怎么购买Solana Mobile?

PANews 1月17日消息&#xff0c;Solana Mobile官方宣布开启其第二代Saga手机&#xff08;Chapter 2&#xff09;的预售&#xff0c;预购押金为450美元&#xff0c;预计将于2025年上半年发货。同时&#xff0c;Chapter 2的发售将会包括推荐&#xff08;Referrals&#xff09;和积…

用MATLAB函数在图表中建立模型

本节介绍如何使用Stateflow图表创建模型&#xff0c;该图表调用两个MATLAB函数meanstats和stdevstats。meanstats计算平均值&#xff0c;stdevstats计算vals中值的标准偏差&#xff0c;并将它们分别输出到Stateflow数据平均值和stdev。 请遵循以下步骤&#xff1a; 1.使用以下…

sql570 | 至少有5名下属的经理 | join on | group by | having

讲给一张表&#xff0c;表字段分别为 id 、姓名、部分、经理id&#xff0c;可能存在张三既是下属也是经理 现在找出下属起码有5名员工的经理 CREATE TABLE Employee (id INT,name VARCHAR(255),department VARCHAR(255),managerId INT );INSERT INTO Employee (id, name, depar…

数据库的内连接和外连接

数据库的内连接和外连接 内连接: 两个或两个以上的表进行关联查询时&#xff0c;查询的结果集中 返回所有满足连接条件的行。 外连接: 两个或两个以上的表进行关联查询时&#xff0c;查询的结果集中 除了返回满足连接条件的行以外&#xff0c;还返回左&#xff08;或右&…