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

news2024/11/18 16:37:29

目录

一、前言

二、使用场景介绍

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

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

执行结果

case when 语法2

select
    id,
    case id
        when 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实现

select
    col1 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
from
    row2col1
group by
    col1;

执行上面的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如下

select
    col1,
    col2,
    concat_ws(',', collect_list(cast(col3 as string))) as col3
from
    row2col2
group by
    col1, 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实现

select
    col1,
    col2,
    lv.col3 as col3
from
    col2row2
        lateral view
            explode(split(col3, ',')) lv as col3;

执行结果

七、写在文末

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

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

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

相关文章

数据结构之二叉树的性质与存储结构

数据结构之二叉树的性质与存储结构 1、二叉树的性质2、二叉树的存储结构 数据结构是程序设计的重要基础&#xff0c;它所讨论的内容和技术对从事软件项目的开发有重要作用。学习数据结构要达到的目标是学会从问题出发&#xff0c;分析和研究计算机加工的数据的特性&#xff0c;…

谁说知识库都是英文的 今天就来一个中文版的

1.安装 1.1创建目录 mkdir -p /opt/trilium-cn cd /opt/trilium-cn 1.2.编写docker-compose.yml文件 version: 3 services:trilium-cn:image: nriver/trilium-cnrestart: alwaysports:- "10012:8080"volumes:# 把同文件夹下的 trilium-data 目录映射到容器内- /opt…

5 python快速上手

数据类型&#xff08;上&#xff09; 1.整型1.1 定义1.2 独有功能1.3 公共功能1.4 转换1.5 其他1.5.1 长整型1.5.2 地板除 2. 布尔类型2.1 定义2.2 独有功能2.3 公共功能2.4 转换2.5 其他2.5.1 做条件自动转换 3.字符串类型3.1 定义3.2 独有功能&#xff08;18/48&#xff09;练…

SpringBoot教程(十五) | SpringBoot集成RabbitMq

SpringBoot教程(十五) | SpringBoot集成RabbitMq RabbitMq是我们在开发过程中经常会使用的一种消息队列。今天我们来研究研究rabbitMq的使用。 rabbitMq的官网&#xff1a; rabbitmq.com/ rabbitMq的安装这里先略过&#xff0c;因为我尝试了几次都失败了&#xff0c;后面等我…

【数据结构】详谈队列的顺序存储及C语言实现

循环队列及其基本操作的C语言实现 前言一、队列的顺序存储1.1 队尾指针与队头指针1.2 基本操作实现的底层逻辑1.2.1 队列的创建与销毁1.2.2 队列的增加与删除1.2.3 队列的判空与判满1.2.4 逻辑的局限性 二、循环队列2.1 循环队列的实现逻辑一2.2 循环队列的实现逻辑二2.3 循环队…

西瓜书读书笔记整理(十二) —— 第十二章 计算学习理论

第十二章 计算学习理论&#xff08;上&#xff09; 12.1 基础知识12.1.1 什么是计算学习理论&#xff08;computational learning theory&#xff09;12.1.2 什么是独立同分布&#xff08;independent and identically distributed, 简称 i . i . d . i.i.d. i.i.d.&#xff0…

USRP相关报错解决办法

文章目录 前言一、本地环境二、相关报错信息二、解决办法1、更换电脑操作系统2、升级最新版固件 前言 在进行 USRP 开发时遇到了一些报错&#xff0c;这里做个记录解决问题的方法。 一、本地环境 电脑操作系统&#xff1a;Windows11MATLAB 版本&#xff1a;MATLAB 2021aUSRP …

JVM:Java类加载机制

Java类加载机制的全过程&#xff1a; 加载、验证、准备、初始化和卸载这五个阶段的顺序是确定的&#xff0c;类型的加载过程必须按照这种顺序按部就班地开始&#xff0c;而解析阶段则不一定&#xff1a;它在某些情况下可以在初始化阶段之后再开始&#xff0c; 这是为了支持Java…

竞赛保研 机器视觉 opencv 深度学习 驾驶人脸疲劳检测系统 -python

文章目录 0 前言1 课题背景2 Dlib人脸识别2.1 简介2.2 Dlib优点2.3 相关代码2.4 人脸数据库2.5 人脸录入加识别效果 3 疲劳检测算法3.1 眼睛检测算法3.2 打哈欠检测算法3.3 点头检测算法 4 PyQt54.1 简介4.2相关界面代码 5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#x…

CSS明显比XPATH更性感!CSS再学一点儿

在selenium应用&#xff0c;CSS比XPATH更性感 To style an element, Front end developers need to locate the element first and then apply styling rules. It looks like this: #logo{ color: white; background: black; }That CSS snippet says, apply color and backgro…

深入探索 Android 中的 Runtime

深入探索 Android 中的 Runtime 一、什么是 Runtime二、Android 中的 Runtime 类型2.1. Dalvik Runtime2.2. ART&#xff08;Android Runtime&#xff09; 三、Runtime 的作用和特点3.1. 应用程序执行环境3.2. 跨平台支持3.3. 性能优化3.4. 应用程序优化 四、与应用开发相关的重…

Unity3D学习之Unity基础——3D数学

文章目录 1. 前言2 Mathf和Math基础2.1 一般用于只计算一次的函数2.1.1 PI Π PI2.1.2 取绝对值 Abs2.1.3 向上取整 CeilToInt2.1.4 向下取整 FloorToInt2.1.5 钳制函数 Clamp2.1.6 获取最大值 Max2.1.7 获取最小值 Min2.1.8 一个数的n次幂 Pow2.1.9 四舍五入 RoundToInt2.1.10…

MySQL主从复制原理与实践:从配置到故障监控

文章目录 前言主从复制原理复制源主节点的工作从节点的工作复制流程的设计 主从复制环境搭建一、主从节点配置二、从节点开启复制步骤1、备份主节点的数据2、将数据同步到从节点3、从节点复制参数配置 三、验证复制环境 主从复制故障监控监控主从复制状态监控主从复制延迟 总结…

Rancher部署k8s集群测试安装nginx(节点重新初始化方法,亲测)

目录 一、安装前准备工作计算机升级linux内核时间同步Hostname设置hosts设置关闭防火墙&#xff0c;selinux关闭swap安装docker 二、安装rancher部署rancher 三、安装k8s安装k8s集群易错点&#xff0c;重新初始化 四、安装kutectl五、测试安装nginx工作负载 一、安装前准备工作…

Python中二维数据(数组、列表)索引和切片的Bug

Python中有关数据结构索引和切片引起的Bug 一维数据索引和切片一维数组一维列表 二维数据的索引和切片二维数组二维(错误)列表 一维数据索引和切片 一维数组 对于一维数据进行索引和切片操作&#xff0c;大家都比较熟悉通过下面代码进行实现 import numpy as np data np.ra…

实验七 RMAN恢复管理器

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的很重要&…

Linux的权限(3)

目录 文件类型 ​d目录文件 -普通文件 l链接文件 b块设备文件 p管道文件 c字符设备文件 文件权限 目录权限 umask 粘滞位 Q1umask权限默认值664/775 Q2"可执行性"权限 Q3"删除"权限 Q4怎么共享一批文件 【1】粘滞位 【2】添加交互人员到所…

SpringBoot跨域问题解决

前端访问后台接口时&#xff0c;浏览器报错&#xff0c;跨域无法访问。 报错信息如下&#xff1a; Response to preflight request doesnt pass access control check: No Access-Control-Allow-Origin header is present on the requested resource. 经过一番百度之后&#…

(2024,VMamba,交叉扫描,线性复杂度,全局感受野,动态权重)视觉状态空间模型

VMamba: Visual State Space Model 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 3. 方法 3.1 基础概念 3.2 2D 选择性扫描 3.3 VMamba 模型 3.3.1 整体架构 3.3.2 VSS…

如何用H5+CSS+JS写一个简单的招聘网站

大家好&#xff0c;我是猿码叔叔&#xff0c;一个 Java 语言开发者。应网友要求&#xff0c;写一个简单的招聘页面。由于技术原因&#xff0c;页面相对简单&#xff0c;朋友们可以选择性的阅读&#xff0c;如果对您有帮助&#xff0c;也可直接拿去使用&#xff0c;因为接下来除…