ODPS SQL ——列转行、行转列这回让我玩明白了!

本文涉及的产品
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
简介: 本文详细介绍了在MaxCompute中如何使用TRANS_ARRAY和LATERAL VIEW EXPLODE函数来实现列转行的功能。

使用场景

有这样一种场景,需要将下面A表中的self_code_list转化为a_tag_list,self_code到a_tag有一一映射关系的,这个映射关系在B表中。对于映射关系的转化一般是用join的方式去解决(目前没有想到更好的方式,如果有哪位大神有更好的方式欢迎在评论区留言)。

image.png

对目前这种数据结构肯定是不好处理的,但是如果转化成图3中所示:

image.png

就可以用直接用self_code关联B表从而得到a_tag的值,如图4中所示,思路清晰、操作简单粗暴。

image.png

两种列转行的姿势

所以核心的问题来了,应该怎么操作把A表转成图3中的样子,这种操作其实就是列转行,解释一下,就是把一行数据的某列(一般是数组)或者几列展开,并选某列或者某几列作为展开的key, 把一行数据转成多行数据。在前面把表A从图1转成图3的案例中,我们是以id, name做为key把self_code_list这一列展开成多行。


在odps的内建函数中有两个函数可以帮我们轻而易举地完成列转行:


TRANS_ARRAY

https://www.alibabacloud.com/help/zh/maxcompute/user-guide/trans-array


LATERAL VIEW  EXPLODE(column)

https://www.alibabacloud.com/help/zh/maxcompute/user-guide/lateral-view


使用TRANS_ARRAY

SELECT  TRANS_ARRAY(2,',',id,name,self_code_list) AS (id,name,self_code)
  FROM  (
            SELECT  id,name
                   ,ARRAY_JOIN(FROM_JSON(JSON_FORMAT(self_code_list),"array<string>"),',')
                    AS self_code_list
              FROM    TABLE_A
              ORDER BY id ASC
  )

表A里self_code_list字段类型是JSON,而TRANS_ARRAY 则要求转为行的的列类型必须是String,所以先把self_code_list转化为String 类型。



这里结合这个列子解释一下这个函数的参数:

trans_array (<num_keys>, <separator>, <key1>,<key2>,,<col1>,<col2>,<col3>) as (<key1>,<key2>,...,<col1>, <col2>)

第一个参数是列转行时做为key的列数,在本例中我们用id和name作为key,所以是2。


第二个参数是把一个String展开为多个String,也就是一行变多行的分割符,根据具体数据的分割符号而定,一般是逗号,分号等。


剩下的参数是String类型的列名,函数会根据第一个参数来判断最后M个列是要展开的列,前面N个列是作为key的列。在本例子中我们列名参数依次是id, name, slef_code_list, 而num_key = 2, 所以结果集中id, name 两列会作为key 列,而self_code_list则是被展开的列。


使用LATERAL VIEW EXPLODE

SELECT  id
        ,name
        ,self_code
FROM    TABLE_A
        LATERAL VIEW EXPLODE(FROM_JSON(JSON_FORMAT(self_code_list),"array<string>")) tmp AS self_code;

需要注意的是EXPLODE 函数的入参必须是ARRAY的。


两种方式都是可以实现列转行,但是两者在处理为空的列会有细微的差别。



看下这几条原始的数据:

SELECT id, name, self_code_list from TABLE_A

where id IN (291, 112, 116, 252)

image.png

针对这四条数据分别用两种方式做转化。

使用TRANS_ARRAY

image.png

使用LATERAW VIEW EXPLODE

image.png

可以看到使用LATERAW VIEW EXPLODE的方式结果集不会保留为空的行,而TRANS_ARRAY的方式则会保留为空的行。



列转行是行转列的逆操作

好了,列转行聊完了,该说说行转列。还记得我们初衷吗 ?我们是要把TableA的self_code_list映射成a_tag_list, 如图8所示。经过前面的列转行操作就可以很轻易的和TABLE表关联,得到图4所示的临时表。

image.png

从图4到图8的操作就是行转列,也就是把多行数据转化成一列或多个列。当然了这也不是瞎转的,跟列转行一样在转化时需要根据key来转化。列转行行转列是一个互逆的过程,在列转行时我们把每行的某列值拆分为多个值,然后按照key变成多行。那么行转列就是根据key把多行数据的某列拼接成一份数据,再依据key变成一行。在本例图4-图8的过程中,我们以id, name做为key, 对atag列用逗号做拼接,id, name, a_tag_list组成唯一的一行。当然也可以转成多列,只需要在拼接的时候指定列的区分方式,然后再对列值做SPLIT 操作即可得到多列。这种拼接的方式可以通过函数WM_CONCAT。

https://www.alibabacloud.com/help/zh/maxcompute/user-guide/wm-concat

在上面的例子中我们是这样使用WM_CONCAT函数的:

SELECT  id
        ,name
        ,WM_CONCAT(',',a_tag) a_tag
from 
T_tmp_4;


这样我们就得到了图8所示的结果集。


至此我们完成了表的列转行、行转列,并最终达成了我们的目标。关于更多表的行转列、列转行还可以参考MaxCompute官方文档:


https://www.alibabacloud.com/help/zh/maxcompute/use-cases/transpose-rows-to-columns-or-columns-to-rows




来源  |  阿里云开发者公众号
作者  |  高迅

相关实践学习
基于MaxCompute的热门话题分析
本实验围绕社交用户发布的文章做了详尽的分析,通过分析能得到用户群体年龄分布,性别分布,地理位置分布,以及热门话题的热度。
SaaS 模式云数据仓库必修课
本课程由阿里云开发者社区和阿里云大数据团队共同出品,是SaaS模式云原生数据仓库领导者MaxCompute核心课程。本课程由阿里云资深产品和技术专家们从概念到方法,从场景到实践,体系化的将阿里巴巴飞天大数据平台10多年的经过验证的方法与实践深入浅出的讲给开发者们。帮助大数据开发者快速了解并掌握SaaS模式的云原生的数据仓库,助力开发者学习了解先进的技术栈,并能在实际业务中敏捷的进行大数据分析,赋能企业业务。 通过本课程可以了解SaaS模式云原生数据仓库领导者MaxCompute核心功能及典型适用场景,可应用MaxCompute实现数仓搭建,快速进行大数据分析。适合大数据工程师、大数据分析师 大量数据需要处理、存储和管理,需要搭建数据仓库?学它! 没有足够人员和经验来运维大数据平台,不想自建IDC买机器,需要免运维的大数据平台?会SQL就等于会大数据?学它! 想知道大数据用得对不对,想用更少的钱得到持续演进的数仓能力?获得极致弹性的计算资源和更好的性能,以及持续保护数据安全的生产环境?学它! 想要获得灵活的分析能力,快速洞察数据规律特征?想要兼得数据湖的灵活性与数据仓库的成长性?学它! 出品人:阿里云大数据产品及研发团队专家 产品 MaxCompute 官网 https://www.aliyun.com/product/odps&nbsp;
相关文章
|
3月前
|
SQL 算法 大数据
为什么大数据平台会回归SQL
在大数据领域,尽管非结构化数据占据了大数据平台80%以上的存储空间,结构化数据分析依然是核心任务。SQL因其广泛的应用基础和易于上手的特点成为大数据处理的主要语言,各大厂商纷纷支持SQL以提高市场竞争力。然而,SQL在处理复杂计算时表现出的性能和开发效率低下问题日益凸显,如难以充分利用现代硬件能力、复杂SQL优化困难等。为了解决这些问题,出现了像SPL这样的开源计算引擎,它通过提供更高效的开发体验和计算性能,以及对多种数据源的支持,为大数据处理带来了新的解决方案。
|
3月前
|
SQL 存储 算法
比 SQL 快出数量级的大数据计算技术
SQL 是大数据计算中最常用的工具,但在实际应用中,SQL 经常跑得很慢,浪费大量硬件资源。例如,某银行的反洗钱计算在 11 节点的 Vertica 集群上跑了 1.5 小时,而用 SPL 重写后,单机只需 26 秒。类似地,电商漏斗运算和时空碰撞任务在使用 SPL 后,性能也大幅提升。这是因为 SQL 无法写出低复杂度的算法,而 SPL 提供了更强大的数据类型和基础运算,能够实现高效计算。
|
4月前
|
SQL 消息中间件 分布式计算
大数据-143 - ClickHouse 集群 SQL 超详细实践记录!(一)
大数据-143 - ClickHouse 集群 SQL 超详细实践记录!(一)
157 0
|
4月前
|
SQL 大数据
大数据-143 - ClickHouse 集群 SQL 超详细实践记录!(二)
大数据-143 - ClickHouse 集群 SQL 超详细实践记录!(二)
114 0
|
4月前
|
SQL 大数据 API
大数据-132 - Flink SQL 基本介绍 与 HelloWorld案例
大数据-132 - Flink SQL 基本介绍 与 HelloWorld案例
89 0
|
4月前
|
SQL 分布式计算 大数据
大数据-97 Spark 集群 SparkSQL 原理详细解析 Broadcast Shuffle SQL解析过程(一)
大数据-97 Spark 集群 SparkSQL 原理详细解析 Broadcast Shuffle SQL解析过程(一)
131 0
|
4月前
|
SQL 分布式计算 算法
大数据-97 Spark 集群 SparkSQL 原理详细解析 Broadcast Shuffle SQL解析过程(二)
大数据-97 Spark 集群 SparkSQL 原理详细解析 Broadcast Shuffle SQL解析过程(二)
126 0
|
4月前
|
SQL 分布式计算 Java
大数据-96 Spark 集群 SparkSQL Scala编写SQL操作SparkSQL的数据源:JSON、CSV、JDBC、Hive
大数据-96 Spark 集群 SparkSQL Scala编写SQL操作SparkSQL的数据源:JSON、CSV、JDBC、Hive
107 0
|
4月前
|
SQL 分布式计算 大数据
大数据-94 Spark 集群 SQL DataFrame & DataSet & RDD 创建与相互转换 SparkSQL
大数据-94 Spark 集群 SQL DataFrame & DataSet & RDD 创建与相互转换 SparkSQL
136 0
|
4月前
|
SQL 存储 分布式计算
大数据-93 Spark 集群 Spark SQL 概述 基本概念 SparkSQL对比 架构 抽象
大数据-93 Spark 集群 Spark SQL 概述 基本概念 SparkSQL对比 架构 抽象
72 0