MaxComputeSQL-列转行和行转列

原文地址

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

 

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

 

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

user_basic_info表

 

idname
1a
2b
3c
 4d

 

user_address表

nameaddress
aadd1
aadd2
badd3
c

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

 

原文地址

 

转载于:https://my.oschina.net/u/3568122/blog/1057774

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值