HIVE实战处理(九) hive函数sort_array解决排序求最大值以及collet_list列表排序混乱

背景:
播放数据有2个来源,根据2个来源取每个用户最大的播放时长作为最后结果。
因为sort_array不支持倒序排列,只能根据arr[1]来确认是最大值(因为只有2个数据源)

select 
	arr,arr[0],arr[1]
from (select 
	name,
	collect_list(play_duration_ms) ,
	sort_array(collect_list(play_duration_ms)) arr,
	arr[1]  --最大的播放时长 
	--sort_array(array(play_duration_ms,heart_passby_duration)) arr
from(
select '1' as name,'200' as play_duration_ms
union all
select '1' as name,'205' as play_duration_ms
) t group by name
) t1

在这里插入图片描述

由collect_list形成的列表经过concat_ws拼接后顺序具有随机性,要保证列表有序只需要在生成列表后使用sort_array函数进行排序即可,
示例如下:

SELECT 
    memberid,
    regexp_replace(
        concat_ws('-',
                    sort_array(
                                collect_list(
                                            concat_ws(':',cast(legcount as string),airways)
                                            )
                                )
                    ),'\\d\:','') hs
from 
(
select 1 as memberid,'A' as airways,2 as legcount
union ALL
select 1 as memberid,'B' as airways,3 as legcount
union ALL
select 1 as memberid,'C' as airways,4 as legcount
union ALL
select 1 as memberid,'D' as airways,1 as legcount
union ALL
select 1 as memberid,'E' as airways,8 as legcount
) as t
group by memberid

构造数据(memberid为会员ID,airway为会员预定机票选择的航司,legcount为下单航段)
在这里插入图片描述
运行结果:
在这里插入图片描述

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值