hive-列转行和行转列

22 篇文章 0 订阅
12 篇文章 0 订阅

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

user_basic_info:

idname
1a
2b
3c
4d
user_address;

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

idnameaddress
1aadd1,add2
2badd3
3cadd4
4dadd5
collect_set 这就用到了hive中的行转列的知识,需要用到两个内置UDF: collect_set, concat_ws,

两个函数解释如下见:http://www.cnblogs.com/end/archive/2012/06/18/2553682.html

建表:

create table user_basic_info(id string, name string);
create table user_address(name string, address string);
加载数据:

load data local inpath '/home/jthink/work/workspace/hive/row_col_tran/data1' into table user_basic_info;
load data local inpath '/home/jthink/work/workspace/hive/row_col_tran/data2' into table user_address;

执行合并:

select max(ubi.id), ubi.name, concat_ws(',', collect_set(ua.address)) as address from user_basic_info ubi join user_address ua on ubi.name=ua.name group by ubi.name;

运行结果:

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

2. 假设我们有一张表:

user_info:

idnameaddress
1aadd1,add2
2badd3
3cadd4
4dadd5
我们需要拆分address,变为:

idnameaddress
1aadd1
1aadd2
2badd3
3cadd4
4dadd5

我们很容易想到用UDTF,explode():

select explode(address) as address from user_info;

这样执行的结果只有address, 但是我们需要完整的信息:

select id, name, explode(address) as address from user_info;

这样做是不对的, UDTF's are not supported outside the SELECT clause, nor nested in expressions

所以我们需要这样做:

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

结果为:

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




Hive中的列转行行转列是通过使用一些特定的内置函数和关键字来实现的。列转行可以使用EXPLODE函数,该函数可以将一个包含复杂结构的数组或者映射拆分成多行。行转列可以使用collect_set函数,该函数将某一列的所有数据转化为一个集合,并且可以使用concat_ws函数将集合中的所有元素以逗号分割连接成一个字符串。此外,为了使用EXPLODE和LATERAL VIEW函数,你可以使用LATERAL VIEW关键字,语法为LATERAL VIEW udtf(expression) tableAlias AS columnAlias。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [hive列转行案例](https://download.csdn.net/download/weixin_38581777/14037437)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [hive行转列列转行](https://blog.csdn.net/qq_24790473/article/details/109710145)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [hive操作(行转列列转行)](https://blog.csdn.net/aiduo3346/article/details/102085019)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值