MaxCompute与 Mysql 之单字段转多行

在实际数据处理中,可能会遇到行列转换的数据处理,在 MaxCompute 与 AnalyticDB MySQL 数据处理与转换 介绍过如多行转一行,本篇主要介绍将逗号分割的字段转成多行

一、MaxCompute 实现方式

在MaxCompute中有TRANS_ARRAY函数,可将列中存储的以固定分隔符格式分隔的数组转为多行

格式如下:
TRANS_ARRAY(num_keys, separator, key1,key2,…,col1, col2,col3) as (key1,key2,…,col1, col2)
num_keys: bigint类型常量,必须>=0。在转为多行时作为转置key的列的个数。
Key是指在将一行转为多行时,在多行中重复的列。
separator:String类型常量,非空,用于将字符串拆分成多个元素的分隔符。
keys:转置时作为key的列, 个数由num_keys指定。如果num_keys指定所有的列都作为key(即num_keys等于所有列的个数),则只返回一行。
cols::要转为行的数组,keys之后的所有列视为要转置的数组,必须为string类型,存储的内容是字符串格式的数组。

函数实现的 Demo 如下所示。

SELECT TRANS_ARRAY(1,'-',t1.c1,t1.c0,t1.c2) AS (c0,c1,c2)
FROM (
		SELECT 'aa-bb-cc-dd' AS c0,
				'ee' AS c1,
				'ff-qq' AS c2
	) AS t1

c2个数不足,会补空,执行结果如下图所示。
MaxCompute与 Mysql 之单字段转多行_第1张图片

二、Mysql 实现方式

MySQL 实现方式主要用到 mysql.help_topic 解释表,表的ID是递增的,方便计数。主要思想是利用序列和字符串的截取。
MaxCompute与 Mysql 之单字段转多行_第2张图片

函数 substring_index 截取字符串。

函数substring_index 格式为
substring_index(parent_str,child_str,num)
parent_str 待截取的字符串,即父串;
child_str 要截取的字符串,即子串
num 截取的位置
实现的SQL如下所示。

SET @phone_str = '小米,苹果,华为';

SELECT 
	help_topic_id,
	length(@ncr_str) as phone_num,
	length(REPLACE(@phone_str, ',', '')) as phone_str_num,
	length(@ncr_str) - length(REPLACE(@phone_str, ',', '')) + 1 as num,
	substring_index(@phone_str, ',', help_topic_id + 1) as now_str,
	substring_index(substring_index(@phone_str, ',', help_topic_id + 1), ',', -1) as str_name
FROM 
	mysql.help_topic
WHERE 
	help_topic_id < length(@ncr_str) - length(REPLACE(@phone_str, ',', '')) + 1;

条件为序列的长度,展示的列为字符串的截取,截取的结果如下所示。
MaxCompute与 Mysql 之单字段转多行_第3张图片

参考博客

【1】https://blog.csdn.net/iuie_sl/article/details/95310574

你可能感兴趣的:(数据处理,大数据,odps,mysql)