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

这篇具有很好参考价值的文章主要介绍了MySQL实现数据炸裂拆分(类似Hive的explode函数的拆分数组功能)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

需求背景

背景描述

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

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

例如数据原始样本:

mysql explode函数,大数据,MySQL,数据库,mysql,hive,数据库,大数据

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

mysql explode函数,大数据,MySQL,数据库,mysql,hive,数据库,大数据

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

实现策略

​ 使用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的原生函数,但对于一些简单的场景,这种方法可以帮助我们实现类似的数据操作。

​ 在实际使用中,根据具体的需求和性能要求,我们可能需要考虑使用其他存储引擎或更复杂的数据模型来处理数组数据。然而,对于一些简单的查询和操作,上述方法提供了一种实现类似功能的方式。文章来源地址https://www.toymoban.com/news/detail-677045.html

到了这里,关于MySQL实现数据炸裂拆分(类似Hive的explode函数的拆分数组功能)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Hive中的explode函数、posexplode函数与later view函数

      在离线数仓处理通过HQL业务数据时,经常会遇到行转列或者列转行之类的操作,就像concat_ws之类的函数被广泛使用,今天这个也是经常要使用的拓展方法。 2.1 函数语法 2.2 函数说明 explode 函数是UDTF 函数,将hive一列中复杂的array或者map结构拆分成多行。 Explode函数是不允

    2024年04月09日
    浏览(11)
  • Hive 中的爆炸函数( lateral view 与 explode 用法)

    explode就是将hive一行中复杂的array或者map结构拆分成多行。 lateral view用于和split, explode等函数一起使用,它能够将一行数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。lateral view首先为原始表的每行调用UDTF,UDTF会把一行拆分成一或者多行,lateral view再把结果组合

    2024年02月12日
    浏览(16)
  • 【hive】行转列—explode()/posexplode()/lateral view 函数使用场景

    功能: 用于和UDTF函数(explode,split)结合使用,把某一行数据拆分成多行数据,再将多行结果组合成一个支持别名的虚拟表。 主要解决select使用UDTF做查询的过程中查询只能包含单个UDTF,不能包含其它字段以及多个UDTF的情况。 语法:LATERAL VIEW udtf(expression) tableAlias AS columnAlia

    2024年04月09日
    浏览(11)
  • 大数据Hive篇:explode 和 posexplode

    大数据Hive篇:explode 和 posexplode

    一. explode单独使用。 1.1. 用于array类型的数据 table_name 表名 array_col 为数组类型的字段 new_col array_col被explode之后对应的列 1.2. 用于map类型的数据 由于map是kay-value结构的,所以它在转换的时候会转换成两列,一列是kay转换而成的,一列是value转换而成的。 table_name 表名 map_col 为

    2024年02月13日
    浏览(11)
  • HIVE SQL通过Lateral View + explode实现列转行

    原表: a b Andy 碟中谍,谍影重重,007 MOMO 小鞋子,朋友啊你的家在哪里 David ‘’ Lily NULL 实现效果 a b Andy 碟中谍 Andy 谍影重重 Andy 007 MOMO 小鞋子 MOMO 朋友啊你的家在哪里 David ‘’ 实现代码: 注: explode函数:处理map结构的字段,将数组转换成多行,所以此处使用了split函数将

    2024年02月12日
    浏览(12)
  • Hive Lateral View + explode 详解

    Hive Lateral View + explode 详解

    hive中的函数分为3类,UDF函数、UDAF函数、UDTF函数 UDF:一进一出 UDAF:聚集函数,多进一出,类似于:count/max/min UDTF:一进多出,如explore()、posexplode(),UDTF函数的时候只允许一个字段 百度explode()时,经常会出现lateral view + explode相关的文章,很少单独写explode()。 分别 了解 ecplode() 与

    2023年04月11日
    浏览(10)
  • 6. Hive中的 explode / posexplode 和 lateral view

    Hive中的 explode / posexplode 和 lateral view 1. explode() 将 arrary 或 map 结构数据拆分成多行,并返回拆分后的每个元素。 1.1 用于 array 的语法如下 explode ():函数中的参数传入的是 arrary 数据类型的列名 newcol:给转换后的列起一个新的名字,用于代表转换之后默认的列名 tablename:原表

    2024年02月13日
    浏览(13)
  • explode与lateral view使用详解(spark及hive环境对比)

    定义: explode函数能够将array及map类型的数据炸开,实现一行变多行 格式: select explode(array/map) from table 示例 原始数据tmp表 name id goods a 1 book_a,food_a b 2 book_b,food_b c 3 null  输出结果 goods_col book_a food_a book_b food_b 定义: Lateral 也是用来对数组进行列转行的,Lateral View主要解决在

    2024年02月03日
    浏览(14)
  • Mysql(函数) 字符串截取、拆分, 逗号分割字符串当做 in 的条件

    Mysql(函数) 字符串截取、拆分, 逗号分割字符串当做 in 的条件

    目录  引言:  数据库函数的总结(一) 1. mysql截取拆分 2. 逗号分割的字符串 作为in条件 - 2.1 正常的效果应该是  --- 2.1.1 错误:  3. 字符串合并(多条数据合并 用\\\'、\\\'分割) 1. 字符串截取、拆分 可以用于将用户输入的字符串按照特定的规则进行截取,比如获取电话号码中的区号、

    2024年02月08日
    浏览(14)
  • 使用DataX实现mysql与hive数据互相导入导出

    使用DataX实现mysql与hive数据互相导入导出

             DataX 是 阿里巴巴开源 的一个异构数据源离线同步工具,致力于实现包括关系型数据库(MySQL、Oracle 等)、HDFS、Hive、ODPS、HBase、FTP 等 各种异构数据源之间稳定高效的数据同步 功能。          为了解决异构数据源同步问题,DataX 将复杂的 网状 的同步链路变成了

    2024年02月08日
    浏览(9)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包