问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

MaxCompute行转列技巧大揭秘!

创作时间:
作者:
@小白创作中心

MaxCompute行转列技巧大揭秘!

引用
CSDN
10
来源
1.
https://blog.csdn.net/helunqu2017/article/details/113816076
2.
https://blog.csdn.net/nsnlc_/article/details/142645289
3.
https://blog.csdn.net/nsnlc_/article/details/143468373
4.
https://help.aliyun.com/zh/maxcompute/use-cases/transpose-rows-to-columns-or-columns-to-rows
5.
https://www.alibabacloud.com/help/zh/maxcompute/user-guide/wm-concat
6.
https://www.xinfinite.net/t/topic/4968
7.
https://developer.aliyun.com/article/1604461
8.
https://article.baoyueai.com/archives/11815
9.
https://developer.aliyun.com/article/781143
10.
https://www.alibabacloud.com/help/tc/maxcompute/user-guide/wm-concat

在大数据处理过程中,你是否遇到过需要将多行数据转换成一行显示的情况?别担心,MaxCompute提供多种方法实现行转列。本文详细介绍了如何使用case when表达式以及wm_concat函数来灵活地完成这一任务。通过具体示例代码,让你轻松掌握这些实用技巧,提高数据分析效率。快来一起探索吧!

01

行转列的基本概念

在数据处理中,行转列(Row to Column)是一种常见的数据转换需求。它通常用于将多行数据按某个维度聚合为单行多列,常用于汇总统计和生成报表。

例如,假设我们有一张学生考试成绩表,每行记录一个学生的单科成绩:

+------------+------------+------------+
| name       | subject    | score      |
+------------+------------+------------+
| 张三        | 语文        | 74         |
| 张三        | 数学        | 83         |
| 张三        | 物理        | 93         |
| 李四        | 语文        | 74         |
| 李四        | 数学        | 84         |
| 李四        | 物理        | 94         |
+------------+------------+------------+

我们可能需要将每个学生的成绩汇总到一行,形成如下的格式:

+--------+------------+------------+------------+
| 姓名   | 语文      | 数学     | 物理      |
+--------+------------+------------+------------+
| 张三   | 74       | 83       | 93        |
| 李四   | 74       | 84       | 94        |
+--------+------------+------------+------------+

这种转换就是典型的行转列操作。

02

使用CASE WHEN实现行转列

CASE WHEN是SQL中常用的条件判断语句,可以灵活地实现行转列。其基本语法结构如下:

SELECT 
  <维度列>,
  MAX(CASE WHEN <条件1> THEN <值1> END) AS <列名1>,
  MAX(CASE WHEN <条件2> THEN <值2> END) AS <列名2>,
  ...
FROM <表名>
GROUP BY <维度列>;

以学生考试成绩为例,我们可以使用CASE WHEN实现行转列:

SELECT 
  name AS 姓名,
  MAX(CASE WHEN subject = '语文' THEN score END) AS 语文,
  MAX(CASE WHEN subject = '数学' THEN score END) AS 数学,
  MAX(CASE WHEN subject = '物理' THEN score END) AS 物理
FROM scores
GROUP BY name;

这条SQL语句的执行逻辑是:

  1. 按照name字段进行分组
  2. 使用CASE WHEN判断科目,将对应的成绩赋值给新的列
  3. 使用MAX函数聚合结果(这里使用MAX是因为每个学生每门课只有一个成绩,使用MAX不会影响结果)
03

使用WM_CONCAT函数实现行转列

WM_CONCAT是MaxCompute提供的一个非常实用的函数,用于将多行数据拼接成一个字符串。其基本语法如下:

WM_CONCAT(separator, column)
  • separator:字符串类型的分隔符
  • column:需要拼接的列,可以是字符串、整数等类型

使用WM_CONCAT函数可以很方便地实现行转列。例如,将学生的成绩按科目拼接成一个字符串:

SELECT 
  name,
  WM_CONCAT(',', score) AS scores
FROM scores
GROUP BY name;

这条SQL语句会将每个学生的成绩用逗号分隔拼接成一个字符串。需要注意的是,如果某行的值为NULL,该行不会参与计算。

04

性能优化建议

在处理大规模数据时,行转列操作可能会遇到性能瓶颈。以下是一些实用的优化建议:

  1. 合理使用GROUP BY:确保GROUP BY的列选择恰当,避免产生过多的分组
  2. 避免过多聚合函数:在同一SQL语句中使用过多聚合函数可能会导致内存溢出
  3. 使用DISTRIBUTE BY和SORT BY:合理分布和排序数据,减少Shuffle阶段的资源消耗
05

列转行的实现方法

与行转列相对应的是列转行(Column to Row),即将单行多列数据拆分为多行。在MaxCompute中,可以使用以下两种方法实现:

  1. LATERAL VIEW EXPLODE:适用于处理数组类型的列
  2. TRANS_ARRAY:更灵活的列转行函数,支持指定key列

例如,将JSON数组拆分为多行:

SELECT 
  user_id,
  exploded_city
FROM (
  SELECT 
    user_id,
    SPLIT(cities, ',') AS city_array
  FROM user_table
) t
LATERAL VIEW EXPLODE(city_array) tmp AS exploded_city;

或者使用TRANS_ARRAY:

SELECT TRANS_ARRAY(1, ',', user_id, city_scores) AS (user_id, city, score)
FROM score_table;

两种方法的主要区别在于处理空值的方式:LATERAL VIEW EXPLODE会忽略空值,而TRANS_ARRAY会保留空值行。

通过灵活组合上述方法,可以满足MaxCompute中大多数行列转换需求。希望这些技巧能帮助你更高效地处理数据,提升数据分析能力。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号