hive的行转列的应用

本文介绍如何使用SQL查询将学生选课数据整理为包含1和0的矩阵,展示了使用`collect_set`、`sort_array`、`groupby`和`array_contains`函数的优雅实现方法,以及最后的笛卡尔积和数据去重操作。
摘要由CSDN通过智能技术生成
有如下数据:

1,a
1,b
1,c
1,e
2,a
2,c
2,d
2,f
3,a
3,b
3,c
3,e

数据说明:

其中第一列为学生id,第二列为学生选的课程。

需求如下:

转成如下形式:其中1表示已经选修,0表示未选修。

idabcdef
1111010
2101101
3111010
建表以及导入数据:
CREATE TABLE t_course (
    id INT,
    course string
    ) row format delimited fields terminated BY ",";

LOAD data LOCAL inpath "/home/t_course.txt" INTO TABLE t_course;
查看数据

在这里插入图片描述

  1. 使用collection_set函数来进行去重,并且合并为一个list,多行变一行;
  2. 使用sort_array进行升序排序;
  3. 使用group by按照id进行分组,多行变一行;
  4. 最后利用笛卡尔积,将1中的所有数据和4中的数据进行join;
  5. 使用array_contains来判断元素是否在集合中;

代码如下:

SELECT id,
    CASE 
        WHEN array_contains(course, all_course [0])
            THEN 1
        ELSE 0
        END AS a,
    CASE 
        WHEN array_contains(course, all_course [1])
            THEN 1
        ELSE 0
        END AS b,
    CASE 
        WHEN array_contains(course, all_course [2])
            THEN 1
        ELSE 0
        END AS c,
    CASE 
        WHEN array_contains(course, all_course [3])
            THEN 1
        ELSE 0
        END AS d,
    CASE 
        WHEN array_contains(course, all_course [4])
            THEN 1
        ELSE 0
        END AS e,
    CASE 
        WHEN array_contains(course, all_course [5])
            THEN 1
        ELSE 0
        END AS f
FROM (
    SELECT id,
        course,
        all_course
    FROM (
        SELECT id,
            collect_set(course) AS course
        FROM t_course
        GROUP BY id
        ) a
    JOIN (
        SELECT sort_array(collect_set(course)) AS all_course
        FROM t_course
        ) b
    ) c
ORDER BY id;
结果如下:

在这里插入图片描述在这里插入图片描述

OK,现在输出的结果就是我们想要的了。

说明

1.不知大家有没有更加优雅的实现方式,若有,请指教。
2.受水平所限,若有不对之处,恳请指正,不胜感激。

最后感谢阅读!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值