ITPub博客

首页 > 大数据 > Spark > 行转列-多行转多列(竖表转横表)

行转列-多行转多列(竖表转横表)

原创 Spark 作者:晨曦_001 时间:2024-09-05 08:03:08 0 删除 编辑

一、基础数据

有学生成绩表,包含学生id、学科、成绩

+
-------------+----------+--------+

| student_id  | subject  | score  |
+ -------------+----------+--------+
| 001         | 语文       | 89     |
| 001         | 数学       | 95     |
| 001         | 英语       | 77     |
| 002         | 语文       | 92     |
| 002         | 数学       | 83     |
| 002         | 英语       | 97     |
| 003         | 语文       | 81     |
| 003         | 数学       | 94     |
| 003         | 英语       | 88     |
+ -------------+----------+--------+

二、函数介绍

三、多行转多列(竖表转横表)

原始数据中是一个竖表,每个学生的每个学科一行数据,对其转换成一张横表,即表中学生id为主键,包含语文、数学、英语三列,列值为对应学科分数。

期望结果

+
-------------+--------+---------+---------+

| student_id  | yuwen  | shuxue  | yingyu  |
+ -------------+--------+---------+---------+
| 001         | 89     | 95      | 77      |
| 002         | 92     | 83      | 97      |
| 003         | 81     | 94      | 88      |
+ -------------+--------+---------+---------+

1.生成三个科目的成绩列

使用case when语句,对三个科目依次判断,是对应科目的取对应科目成绩,不是对应科目不取值。

执行SQL


select student_id,

        case  when subject =  '语文'  then score  end  as yuwen,
        case  when subject =  '数学'  then score  end  as shuxue,
        case  when subject =  '英语'  then score  end  as yingyu
from t_student_score

执行结果

+
-------------+--------+---------+---------+

| student_id  | yuwen  | shuxue  | yingyu  |
+ -------------+--------+---------+---------+
| 001         | 89     | NULL    | NULL    |
| 001         | NULL   | 95      | NULL    |
| 001         | NULL   | NULL    | 77      |
| 002         | 92     | NULL    | NULL    |
| 002         | NULL   | 83      | NULL    |
| 002         | NULL   | NULL    | 97      |
| 003         | 81     | NULL    | NULL    |
| 003         | NULL   | 94      | NULL    |
| 003         | NULL   | NULL    | 88      |
+ -------------+--------+---------+---------+

2.聚合,将每个学生的科目放到同一行

使用聚合函数,将学生不同科目成绩压缩到同一行。

执行SQL


select student_id,

        sum( case  when subject =  '语文'  then score  end)  as yuwen,
        sum( case  when subject =  '数学'  then score  end)  as shuxue,
        sum( case  when subject =  '英语'  then score  end)  as yingyu
from t_student_score
group  by student_id

执行结果

+
-------------+--------+---------+---------+

| student_id  | yuwen  | shuxue  | yingyu  |
+ -------------+--------+---------+---------+
| 001         | 89     | 95      | 77      |
| 002         | 92     | 83      | 97      |
| 003         | 81     | 94      | 88      |
+ -------------+--------+---------+---------+

四、数据准备


--建表语句

CREATE  TABLE  IF  NOT  EXISTS t_student_score
(
    student_id  string,  -- 学生id
    subject     string,  -- 学科
    score       bigint   -- 分数
)
     COMMENT  '学生成绩表';

insert  into t_student_score
values ( '001',  '语文',  89),
       ( '001',  '数学',  95),
       ( '001',  '英语',  77),
       ( '002',  '语文',  92),
       ( '002',  '数学',  83),
       ( '002',  '英语',  97),
       ( '003',  '语文',  81),
       ( '003',  '数学',  94),
       ( '003',  '英语',  88);

相关推荐

  1. 行转列-collect_list,collect_set进行简单行转列
  2. 行转列-使用transform进行有序行转列
  3. 行转列-使用transform进行有序行转列-多列一一对应
  4. 行转列-多行转多列(竖表转横表)
  5. 列转行-多列转多行(横表变竖表)
  6. 列转行-lateral view explode列转行
  7. 列转行-explode_outer和lateral view outer
  8. 列转行-posexplode多列对应转行
  9. 列转行-lateral view outer posexplode及posexplode_outer多列对应转行


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70040536/viewspace-3026876/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
公众号:数据仓库技术 数据仓库技术:https://dwsql.com spark内置函数手册: https://sparkfunctions.com

注册时间:2022-12-18

  • 博文量
    116
  • 访问量
    55261