MySQL实现数据炸裂拆分(类似Hive的explode函数的拆分数组功能)

news2024/9/23 23:34:16

MySQL实现数据炸裂拆分(类似Hive的"explode"函数的拆分数组功能)

需求背景

背景描述

​ 在Hive中,"explode"函数用于将数组类型的列拆分为多行,以便对数组中的每个元素进行处理。然而,在MySQL中,并没有直接的类似功能。但是,我们可以使用一些技巧来模拟这个功能,实现在MySQL中拆分数组并进行查询的操作。本文将介绍如何在MySQL中实现类似Hive的"explode"函数的拆分数组功能。

​ 场景模拟:假设我们有一个名为wow_info的表,其中包含一个包含竖线分隔的数字列表的列tianfu,我们希望将每一种天赋拆分为多行进行查询。

例如数据原始样本:

希望将最后一列tianfu中不同值按照|拆分,对应到一个个值,目标结果:

​ 一般情况下这类场景均在数仓中处理,但偶尔也会出现处理任务前置的情况,实现思路如下。

实现策略

​ 使用MySQL的内置函数SUBSTRING_INDEX和FIND_IN_SET来实现类似于Hive的"explode"功能

  1. SUBSTRING_INDEX:
    • SUBSTRING_INDEX(str, delim, count)函数返回字符串 str 在指定分隔符 delim 出现的前 count 次或后 count 次的子字符串。
    • 该函数可用于字符串的拆分和截取操作。它接受三个参数:str 是待处理的字符串,delim 是分隔符,count 指定要截取的次数。
    • 使用正数 count 将返回字符串 str 中在 delim 出现的前 count 次的子字符串,使用负数 count 将返回字符串 str 中在 delim 出现的后 count 次的子字符串。
  2. FIND_IN_SET:
    • FIND_IN_SET(str, str_list)函数在逗号分隔的字符串列表 str_list 中查找指定字符串 str 的位置。
    • 该函数可用于检查给定字符串是否在逗号分隔的列表中存在,并返回对应的位置。如果找到匹配,返回值是位置的索引(从1开始),否则返回0。
    • 它接受两个参数:str 是要查找的字符串,str_list 是逗号分隔的字符串列表。

这些函数在数据处理和查询中非常有用,尤其是在处理字符串、拆分和搜索等操作时。它们可以与其他MySQL函数和查询语句结合使用,提供灵活性和便利性。

实现需求

这里做一些虚拟数据来举例,原理不变

use wow;

CREATE TABLE `wow_info` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '角色id',
  `role` varchar(255) DEFAULT NULL COMMENT '角色简称',
  `role_cn` varchar(255) DEFAULT NULL COMMENT '角色类型',
  `role_pinyin` varchar(255) DEFAULT NULL COMMENT '角色拼音',
  `zhuangbei` varchar(255) DEFAULT NULL COMMENT '装备类型',
  `tianfu` varchar(255) DEFAULT NULL COMMENT '天赋类型',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8;

INSERT INTO `wow_info` VALUES (1, 'fs', '法师', 'fashi', '布甲', '冰法|火法|奥法');
INSERT INTO `wow_info` VALUES (2, 'ms', '牧师', 'mushi', '布甲', '神牧|戒律|暗牧');
INSERT INTO `wow_info` VALUES (3, 'ss', '术士', 'shushi', '布甲', '毁灭|痛苦|恶魔');
INSERT INTO `wow_info` VALUES (4, 'dz', '盗贼', 'daozei', '皮甲', '狂徒|刺杀|敏锐');
INSERT INTO `wow_info` VALUES (5, 'ws', '武僧', 'wuseng', '皮甲', '酒仙|踏风|织雾');
INSERT INTO `wow_info` VALUES (6, 'xd', '德鲁伊', 'xiaode', '皮甲', '恢复|平衡|野性|守护');
INSERT INTO `wow_info` VALUES (7, 'dh', '恶魔猎手', 'emolieshou', '皮甲', '复仇|浩劫');
INSERT INTO `wow_info` VALUES (8, 'lr', '猎人', 'lieren', '锁甲', '兽王|生存|射击');
INSERT INTO `wow_info` VALUES (9, 'sm', '萨满', 'saman', '锁甲', '恢复|增强|元素');
INSERT INTO `wow_info` VALUES (10, 'long', '龙人', 'longren', '锁甲', '湮灭|恩护|增辉');
INSERT INTO `wow_info` VALUES (11, 'dk', '死亡骑士', 'siwangqishi', '板甲', '鲜血|冰霜|邪恶');
INSERT INTO `wow_info` VALUES (12, 'zs', '战士', 'zhanshi', '板甲', '武器|狂暴|防护');
INSERT INTO `wow_info` VALUES (13, 'sq', '圣骑士', 'shengqi', '板甲', '神圣|防护|惩戒');

代码实现SQL:

SELECT role
	, SUBSTRING_INDEX(SUBSTRING_INDEX(tianfu, '|', numbers.n), '|', -1) AS exploded_value
FROM wow.wow_info
	JOIN (
		SELECT 1 AS n
		UNION ALL
		SELECT 2
		UNION ALL
		SELECT 3
		UNION ALL
		SELECT 4
	) numbers
	ON CHAR_LENGTH(tianfu) - CHAR_LENGTH(REPLACE(tianfu, '|', '')) >= numbers.n - 1;

'''
1	fs	法师	fashi	布甲	冰法|火法|奥法
2	ms	牧师	mushi	布甲	神牧|戒律|暗牧
3	ss	术士	shushi	布甲	毁灭|痛苦|恶魔
4	dz	盗贼	daozei	皮甲	狂徒|刺杀|敏锐
5	ws	武僧	wuseng	皮甲	酒仙|踏风|织雾
6	xd	德鲁伊	xiaode	皮甲	恢复|平衡|野性|守护
7	dh	恶魔猎手	emolieshou	皮甲	复仇|浩劫
8	lr	猎人	lieren	锁甲	兽王|生存|射击
9	sm	萨满	saman	锁甲	恢复|增强|元素
10	long	龙人	longren	锁甲	湮灭|恩护|增辉
11	dk	死亡骑士	siwangqishi	板甲	鲜血|冰霜|邪恶
12	zs	战士	zhanshi	板甲	武器|狂暴|防护
13	sq	圣骑士	shengqi	板甲	神圣|防护|惩戒
'''

查询结果:

id role_cn tianfu
1	法师	冰法
1	法师	火法
1	法师	奥法
2	牧师	神牧
2	牧师	戒律
2	牧师	暗牧
3	术士	毁灭
3	术士	痛苦
3	术士	恶魔
4	盗贼	狂徒
4	盗贼	刺杀
4	盗贼	敏锐
5	武僧	酒仙
5	武僧	踏风
5	武僧	织雾
6	德鲁伊	恢复
6	德鲁伊	平衡
6	德鲁伊	野性
6	德鲁伊	守护
7	恶魔猎手	复仇
7	恶魔猎手	浩劫
8	猎人	兽王
8	猎人	生存
8	猎人	射击
9	萨满	恢复
9	萨满	增强
9	萨满	元素
10	龙人	湮灭
10	龙人	恩护
10	龙人	增辉
11	死亡骑士	鲜血
11	死亡骑士	冰霜
11	死亡骑士	邪恶
12	战士	武器
12	战士	狂暴
12	战士	防护
13	圣骑士	神圣
13	圣骑士	防护
13	圣骑士	惩戒

总结

请注意,上述示例中的子查询(SELECT 1 AS n UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4)是根据数组中最大元素个数进行调整的。你可以根据需要修改子查询来适应不同长度的数组。

这里如果元素个数非常多,应该是会影响查询性能

​ 结论: 通过使用MySQL的内置函数和一些技巧,我们可以在MySQL中实现类似于Hive的"explode"函数的拆分数组功能。尽管这种方法可能在性能上不如Hive的原生函数,但对于一些简单的场景,这种方法可以帮助我们实现类似的数据操作。

​ 在实际使用中,根据具体的需求和性能要求,我们可能需要考虑使用其他存储引擎或更复杂的数据模型来处理数组数据。然而,对于一些简单的查询和操作,上述方法提供了一种实现类似功能的方式。

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

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

相关文章

前置微小信号放大器怎么用

前置微小信号放大器是一种用于将微弱信号从传感器转换成足够强度的信号以便更好地进行检测和处理的设备。它主要应用于各种传感器领域,例如温度传感器、压力传感器、光学传感器和生物传感器等。前置微小信号放大器的作用是提高信号的信噪比,减小噪声干扰…

天津热门大数据培训班 大数据选课技巧

大数据开发技术的应用时时刻刻都会影响我们的生活,所以很多想转行做大数据开发,大数据开发技术不断更新和发展,很多企业在开发过程中需要的大数据开发技术不断提高要求,因此市面上缺少的是要全面技能的大数据开发人员。 什么是大…

使用 Docker Desktop 安装 Centos 系统

一、前言 由于 Docker 是一个容器,它支持在一个服务器进行多服务部署,并且还能保持服务的独立性,那么,在Docker 上的运用时 我们也是可以 独立部署多个系统来做不同是其他,这样环境独立的情况下,也就不会造…

投票评选活动小程序v2-用户报名图片上传

投票评选活动小程序v2-用户自行报名收集材料页面 主要收集项目或者作品图片及其描述,可以在后台进行统一录入,也可以是在用户界面,让用户自行报名上传。 这里开发了一个“我要报名”页面,在首页点击“我要报名”按钮跳转过来。 …

精耕细作的运维资源成本管控方法-互联网企业的Finops思考与实践

当前,降本增效成为各大互联网公司的重要方向,IT成本则占据了互联网成本的大头。随着IT资源成本花费越来越高,很多公司意识到掌握管控成本和优化成本的重要性。 如何有效的降本?如何做好成本的洞察管控?如何掌握资源成…

5000字干货!让你一次搞懂什么是高保真原型

在产品设计领域,尤其是在用户体验设(UX)中,高保真原型至关重要。它是一种几乎按照产品最终的呈现模样制作出来的原型,包含产品的细节、真实的交互和完善的UI。正因为高保真原型最接近真实产品,因此成为企业…

使用Streamlit和OpenAI API构建视频摘要

本文提供了使用Streamlit和OpenAI创建的视频摘要应用程序的概述。该程序为视频的每个片段创建简洁的摘要,并总结视频的完整内容。 要运行应用程序,需要安装以下依赖项: Python(3.7或更高版本)StreamlitOpenAI API密钥llama_indexyoutube_transcript_api…

Vue3+Vite+Pinia+Naive项目搭建之二:scss 的安装和使用

前言 如果对 vue3 的语法不熟悉的,可以移步 Vue3.0 基础入门,快速入门。 1. 安装依赖 yarn add sass -D // or npm install sass -D 2. 页面样式初始化 reset.scss /* 新建 src/assets/style/reset.scss */ /* 页面样式初始化 */ html, body, div, s…

Linux VS Windows 孰优孰劣?

目录 1. 开源 vs. 闭源:2. 用户界面:3. 软件兼容性:4. 系统安全性:5. 社区支持和文档资源: Linux和Windows是两个主要的操作系统,它们在很多方面都有不同的特点和使用体验。以下是对Linux和Windows进行比较…

python_day1

单行注释规范,#号后留一空格 # 单行注释多行注释,三个单引号或三个双引号 duo hang zhu shi 赋值给变量时为字符串 n 123print(n)查看类型:type() a 111 b "111" if a b:print("true")print(a)print(type(a)) el…

Ubuntu20.04+Docker+ROS Noetic 可视化容器管理工具Portainer

1. 安装docker 官网教学安装网址:Install Docker Engine on Ubuntu | Docker Documentation 2. 安装noetic镜像 ros镜像网址 https://hub.docker.com/r/osrf/ros https://hub.docker.com/r/osrf/ros/tags sudo docker pull osrf/ros:noetic-desktop-full 3. 创…

高效提升控制效率 | 基于ACM32 MCU的LED灯箱控制器方案

前言 LED灯箱上各种文字、图案有序跳跃、交替辉映,产生强烈的视觉冲击力,被广泛应用于商场、美容美发、宾馆、娱乐场所等地方。 锁存器的工作原理 在LED和数码管显示方面,要维持一个数据的显示,往往要持续的快速的刷新。尤其…

vant省市区引入@vant/area-data官方数据报错问题解决

我们依照官方流程引入数据 yarn add vant/area-dataimport { areaList } from vant/area-data;Page({data: {areaList,}, });我们正常引入后会发现报错为 module ‘node_File/area-data/dist/data1.js’ is not defined 按照网上的vant-weapp的Area 省市区选择组件无法显示进行…

Segmentation fault (core dumped)问题解决

torch:1.10.0cu111 pandas:1.3.3 报错: 定位: df pd.DataFrame(columns[epoch, model.sigma1.cpu().detach().numpy(), model.sigma2.cpu().detach().numpy(),model.sigma3.cpu().detach().numpy(),iter,avg_ssim, avg_psnr,model.current…

LeetCode 75 —— 98. 验证二叉搜索树

LeetCode 75 —— 98. 验证二叉搜索树 一、题目描述: 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下: 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子…

【MYSQL高级】Mysql的SQL性能分析【借助EXPLAIN分析】

性能分析 要说sql有问题,需要拿出证据,因此需要性能分析 Mysql查询优化器(Mysql Query Optimizer) Mysql中有专门负责优化SELECT语句的优化器模块,主要功能:通过计算分析系统中收集到的统计信息&#xf…

Mali Offline Compiler - 官方视频教学 - 笔录

文章目录 目的Mali Offline Compiler 使用实例视频分析 shadermalioc 命令制定你想要分析的 shader制定你想要分析的着色器对应的 GPU实例解析内容硬件结构 & 驱动 & Shader 类型信息寄存器、是否堆溢出、16-bit 算术占比寄存器的使用量减少浮点精度优化堆溢出与否16-b…

基于Java+vue前后端分离学习交流论坛设计实现(源码+lw+部署文档+讲解等)

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

easyExcel实现动态导出需要的字段列

easyExcel实现动态导出需要的字段列 实体概况 package excel;import com.alibaba.excel.annotation.ExcelIgnore; import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.write.style.ColumnWidth; import com.alibaba.excel.annotation.…

C++学习笔记-第11单元 标准模板库介绍

第11单元 标准模板库介绍 文章目录 第11单元 标准模板库介绍单元导读11.1 标准模板库(STL)基础11.2 STL容器简介11.3 STL迭代器简介11.3.1 使用迭代器访问容器中的元素11.3.2 迭代器类型11.3.3 迭代器支持的运算符操作 11.4 顺序容器11.4.1 顺序容器的逻辑结构11.4.2 代码展示s…