原文地址
大数据计算服务(MaxCompute,原名ODPS)是一种快速、完全托管的TB/PB级数据仓库解决方案。MaxCompute向用户提供了完善的数据导入方案以及多种经典的分布式计算模型,能够更快速的解决用户海量数据计算问题,有效降低企业成本,并保障数据安全。产品地址:https://www.aliyun.com/product/odps
今天通过两个示例来教大家如何实现列转行和行转列问题。
1. 假设我们在MaxCompute中有两张表,其中一张表是存用户基本信息,另一张表是存用户的地址信息等,表数据假设如下:
user_basic_info表
id
name
1
a
2
b
3
c
4
d
user_address表
name
address
a
add1
a
add2
b
add3
c
add4
d
add5
我们可以看到同一个用户不止一个地址(这里是假设的),我们需要把数据变为如下格式:
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