栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

快速实现分列转到行(SQL版)一个问题,三种解法!

快速实现分列转到行(SQL版)一个问题,三种解法!

大家好,我是热心读者。

首先,这是一篇水文,但是作为一个系列的三胞胎之一,我觉得有必要通过一题多解来扩散一下思维,正所谓“条条大路通罗马”。


前两篇文章分别为:

快速实现分列转到行(Excel版)

快速实现分列转到行(Python版)

数据源以及效果大致是这样的:

通过观察数据,我们发现其实达到的效果,就是列转行,读懂了题意,那么解法就很容易出来了。

下文语法为hivesql,其实在mysql或者sqlserver中也可以实现,不过是需要换一换函数即可,关系性数据库的作业 就留给读者来实现了。


好的,我们就先来构造一下数据:首先建表,两个字段:

create table if not exists student_info(
    class string COMMENT '年级',
    students string COMMENT '姓名'
);

其次,往表中插入数据:

INSERT INTO TABLE yht_dw.student_info
SELECt  *
FROM    (
            SELECt  '1年级' AS class
                    ,'A1;B1;C1' AS name
            UNIOn ALL
            SELECT  '2年级' AS class
                    ,'A2;B2;C2' AS name
            UNIOn ALL
            SELECT  '3年级' AS class
                    ,'A3;B3;C3' AS name
            UNIOn ALL
            SELECT  '4年级' AS class
                    ,'A4;B4;C4' AS name
            UNIOn ALL
            SELECT  '5年级' AS class
                    ,'A5;B5;C5' AS name
            UNIOn ALL
            SELECT  '6年级' AS class
                    ,'A6;B6;C6' AS name
            UNIOn ALL
            SELECT  '7年级' AS class
                    ,'A7;B7;C7' AS name
            UNIOn ALL
            SELECT  '8年级' AS class
                    ,'A8;B8;C8' AS name
            UNIOn ALL
            SELECT  '9年级' AS class
                    ,'A9;B9;C9' AS name
        ) t
;

表中数据情况:

下面就直接公布答案:

SELECT  t.class
        ,item AS name
FROM    yht_dw.student_info t
LATERAL VIEW explode(split(t.students,';')) names AS item
;

上结果图:

来解释一下这里的语法

split(string,seprator)

split函数传入两个参数,对string按照seprator进行拆分,这里就相当于把一个字符串变成了一个array

explode

顾名思义,就是“爆炸”函数,就是把上面拆分的array给炸开,由一行三列,变为三行一列

lateral view

跟 explode是一个固定搭配,相当于一种笛卡尔积,将爆炸函数得到的行跟class关联起来

正常来讲,文章到此就结束了,但是太水我觉得内心不安;

而有的读者也会有疑问,我列转行了,那我如何“回去”呢?——也就是如何进行转列呢?


下面接着上脚本:

SELECt  class
        ,collect_set(name) AS names
FROM    (
            SELECt  t.class
                    ,item AS name
            FROM    yht_dw.student_info t
            LATERAL VIEW explode(split(t.students,';')) names AS item
        ) tt
GROUP BY class
;

上结果图:

我懒,没有重新构造数据,直接用的子查询,但是看到结果,可能有读者会有疑问,这个咋还有方括号,还有双引号,这个也太不美观了。

别急,我先解释完语法,解释完,再来优化。

其实hive里有一个类似于“汇总数据”sum的函数,collect_set是专注于文本的汇总杀器,而重要的是:它会剔除重复记录。

那如何解决方括号和双引号的问题呢?

其实也很简单,上脚本:

SELECt  class
        ,concat_ws(';',collect_set(name)) AS names
FROM    (
            SELECt  t.class
                    ,item AS name
            FROM    yht_dw.student_info t
            LATERAL VIEW explode(split(t.students,';')) names AS item
        ) tt
GROUP BY class
;

上优化后结果图:

其实就是加了一个concat_ws函数,此时就把方括号跟双引号给去除了。


好了,今天的文章就是这样,希望没有接触hive语法的同学有所得,已经熟悉hive的同学莫要嘲笑知识点的简单。

以上。

一天介绍一本书(凹凸数据)

别怕,Excel VBA其实很简单(第3版):本书用浅显易懂的语言和生动形象的比喻,并配以大量插画,讲解Excel VBA中看似复杂的概念和代码。从简单的宏录制与运行、VBA编程环境和基础语法的介绍,到常用Excel对象的操作与控制、事件的灵活使用、设计自定义的操作界面、调试与优化编写的代码,都进行了形象的介绍。


点击这里,阅读更多数据文章!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/629672.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号