MaxCompute SQL-列转行和行转列

    xiaoxiao2023-08-17  222

    大数据计算服务(MaxCompute,原名ODPS)是一种快速、完全托管的TB/PB级数据仓库解决方案。MaxCompute向用户提供了完善的数据导入方案以及多种经典的分布式计算模型,能够更快速的解决用户海量数据计算问题,有效降低企业成本,并保障数据安全。产品地址:https://www.aliyun.com/product/odps

    今天通过两个示例来教大家如何实现列转行和行转列问题

    1. 假设我们在MaxCompute中有两张表,其中一张表是存用户基本信息,另一张表是存用户的地址信息等,表数据假设如下:

    user_basic_info表

    idname1a2b3c 4d

    user_address

    nameaddressaadd1aadd2badd3c

    add4

    dadd5

    我们可以看到同一个用户不止一个地址(这里是假设的),我们需要把数据变为如下格式:

    id

    name

    address

    1

    a

    add1,add2

    2

    b

    add3

    3

    c

    add4

    4

    d

    add5

     

    建表:

    CREATE TABLE user_basic_info ( id string, name string );

    CREATE TABLE user_address ( name string, address string );

    插入数据:

    insert into table user_basic_info select '1','a' from (select count(1) from user_basic_info) t;

    insert into table user_address select 'a','add1' from (select count(1) from user_address) t;

    执行合并:

    select ubi.id, ubi.name, wm_concat(',', ua.address) as address from user_basic_info ubi join user_address ua on ubi.name=ua.name GROUP BY ubi.id, ubi.name;

    运行结果:

    1       a       add1,add2

    2       b       add3

    3       c       add4

    4       d       add5

     

     

    2. 假设我们有一张表:

    user_info表

    id

    name

    address

    1

    a

    add1,add2

    2

    b

    add3

    3

    c

    add4

    4

    d

    add5

     

    我们需要拆分address,变为:

    id

    name

    address

    1

    a

    add1

    1

    a

    add2

    2

    b

    add3

    3

    c

    add4

    4

    d

    add5

     

    建表

    CREATE TABLE user_info ( id string, name string, address string );

    插入数据(导入第一个实验的结果):

    insert into table user_info select ubi.id, ubi.name, wm_concat(',', ua.address) as address from user_basic_info ubi join user_address ua on ubi.name=ua.name GROUP BY ubi.id, ubi.name;

    执行拆分:

    select id, name, add_new from user_info ui lateral view explode(split(ui.address,',')) adtable as add_new;

     

    结果为:

    1       a       add1 1       a       add2 2       b       add3 3       c       add4 4       d       add5

     

    最新回复(0)