hive多行变一行

项目github地址:bitcarmanlee easy-algorithm-interview-and-practice
欢迎大家star,留言,一起学习进步

1.需求描述

在数据处理过程中,我们不光要将一行变为多行,有时候还需要将多行变为一行。
有如下格式的数据:
msgid appid
1490549504092 1002496
1490549504092 1002505
1490549504105 1005565
1490549504105 1002496
我们可能需要将相同的msgid对应的不同的appid汇聚到一起。怎么完成这个任务呢?

2.collect_set

collect_set可以完美解决上面的需求。直接看代码

SELECT b.msgid,
        b.allappid 
FROM 
    (SELECT a.msgid,
         concat_ws('-',collect_set( cast(a.appid as string))) as allappid
    FROM 
        (SELECT msginfo.msgid AS msgid,
         appinfo.appid AS appid
        FROM XXX tablesample(0.1 percent)
        WHERE date = 20170327
        GROUP BY  msginfo.msgid,appinfo.appid)a
        GROUP BY  a.msgid)b
	where  size(split(b.allappid,"-")) > 1
	limit 100

最终出来的结果:

1490549504092	1002496-1002505
1490549504105	1005565-1002496

3.值得注意的地方

1.collect_set顾名思义,就是根据group by后面的字段分组,然后将collect_set方法里的字段聚合在一块。
2.collect_set接受的参数是string类型,如果是其他类型的数据,需要转为string。
3.split方法返回的是一个数组,求数组长度的函数为size。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
回答: 在Hive中,将多行换为多列可以使用多种方法。其中一种方法是使用SQL语句中的UNION ALL操作符,将多个查询结果合并为一个结果集。例如,可以使用以下SQL语句将多行换为多列: ``` select col1, 'c' as col2, col2 as col3 from col2row1 UNION ALL select col1, 'd' as col2, col3 as col3 from col2row1 UNION ALL select col1, 'e' as col2, col4 as col3 from col2row1; ``` 这个SQL语句将col2row1表中的数据按照指定的列进行组合,每个查询结果都会添加一个新的列,最终得到的结果集将包含多个列。\[2\] 另一种方法是使用Hive中的lateral view和explode函数。这个方法适用于一列中包含多个数据的情况,比如Map或array。可以使用以下SQL语句将多行换为多列: ``` select col1, col2, lv.col3 as col3 from col2row2 lateral view explode(split(col3, ',')) lv as col3; ``` 这个SQL语句使用explode函数将col3列中的数据切分为多个行,并将其展示为多列的形式。\[3\] 总结起来,Hive中可以使用UNION ALL操作符或lateral view和explode函数来实现多行多列的操作。具体使用哪种方法取决于数据的结构和需求。 #### 引用[.reference_title] - *1* *2* *3* [Hive多行多列,多列多行](https://blog.csdn.net/weixin_44870066/article/details/128006898)[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^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值