您的位置:首页 > 数据库

MaxComputeSQL-列转行和行转列

2017-06-28 00:00 225 查看
摘要: 1. 假设我们在MaxCompute中有两张表,其中一张表是存用户基本信息,另一张表是存用户的地址信息等,表数据假设如下: user_basic_info: id name 1 a 2 b 3 c

原文地址

大数据计算服务(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
cadd4
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

原文地址

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  大数据