来看一道互联网公司的面试题:

有个用户好友表:字段如下
uid  fans_uid   score
返回:uid, fans_uid_list【fans_uid的拼接串,按照score降序拼接】

给出数据源:每个uid,有很多对应的fans_uid,每个fans_uid 都对应一个score,我们需要按uid分组,将fans_uid 的score按降序排序,将fans_uid 放在一个列表中,做好友推荐

create temporary table tb_user_fans as
select 1 as uid,'a' as fans_uid,3 as score
union all
select 1 as uid,'b' as fans_uid,1 as score
union all
select 1 as uid,'c' as fans_uid,4 as score
union all
select 1 as uid,'d' as fans_uid,3 as score
union all
select 1 as uid,'e' as fans_uid,2 as score
union all
select 2 as uid,'a' as fans_uid,4 as score
union all
select 2 as uid,'b' as fans_uid,3 as score
union all
select 2 as uid,'c' as fans_uid,1 as score
union all
select 2 as uid,'d' as fans_uid,2 as score
union all
select 2 as uid,'e' as fans_uid,5 as score
union all
select 3 as uid,'a' as fans_uid,6 as score
union all
select 3 as uid,'b' as fans_uid,3 as score
union all
select 3 as uid,'c' as fans_uid,5 as score
;

我想要的结果:按照uid分组,按照score降序排序,取出fans_uid放到列表里

1    [c,d,a,e,b]
2   [e,a,b,d,c]
3   [a,c,b]

解法一:

selectuid,collect_list(fans_uid) as fans_uid_list
from (
select uid,fans_uid,score,row_cnt
from (selectuid,fans_uid,score,row_number() over (partition by uid order by score desc ) as row_cntfrom tb_user_fans)
order by row_cnt asc
)
group by uid
order by uid

如果数据量大不推荐使用,因为使用到了全局排序order by,只有一个reducer,那么数据量大计算要很长时间。

解法二:

select uid,regexp_replace(concat_ws(',',sort_array(collect_list(conact_ws(':' ,lpad(cast(rank_num as string),5,'0') ,fans_uid)))),'\\d+\:','') as fans_uid_list
from (selectuid,fans_uid,score,row_number() over (partition by uid order by score desc ) as row_cntfrom tb_user_fans
)
group by uid

这里将row_cnt放在了fans_uid之前,用冒号分隔,然后用sort_array函数对collect_list之后的结果进行排序(只支持升序)。特别注意,rank必须要在高位补足够的0对齐,因为排序的是字符串而不是数字,如果不补0的话,按字典序排序就会变成1, 10, 11, 12, 13, 2, 3, 4…,又不对了。
将排序的结果拼起来之后,用regexp_replace函数替换掉冒号及其前面的数字,大功告成。

解法三:最优解,写法简洁

selectuid,collect_list(fans_uid) as fans_uid_list
from (select uid,fans_uid,scorefrom tb_user_fans distribute by uid sort by uid,score desc
)
group by uid

诀窍是使用带有DISTRIBUTE BY和SORT BY语句的子查询


以上内容仅供参考学习,如有侵权请联系我删除!
如果这篇文章对您有帮助,左下角的大拇指就是对博主最大的鼓励。
您的鼓励就是博主最大的动力!

Hive中collect_list()排序问题详解相关推荐

  1. hive中order by详解

    order by的使用及讲解 1. order by的使用 大家都清楚在hive中order by是用来排序的,使用语法如下 SELECT * FROM tab_name ORDER BY colum ...

  2. php栏目页内容排序问题,Dedecms频道列表页栏目排序问题详解

    织梦Dedecms频道列表页栏目排序问题详解,问题描述如下: 各位大大,小弟我想在首页调用6个栏目,typeid分别是1,2,3,4,5,40,默认的排序小弟不想要,希望改为1,40,3,4,5,2 ...

  3. HIVE面试题原理详解 统计用户连续交易的总额、连续登陆天数、连续登陆开始和结束时间、间隔天数

    HIVE面试题原理详解 统计用户连续交易的总额.连续登陆天数.连续登陆开始和结束时间.间隔天数 友情提示 创建数据表 添加数据 流程图 第一步分析(子表a) 第二步分析(子表b) 第三步分析(子表c) ...

  4. 大数据单机学习环境搭建(5)Hive建表DDL详解

    专题:大数据单机学习环境搭建和使用 1. Hive建表简单示例 1.1.Hive建表语句 1.2.表详细信息 1.3.数据展示 2. Hive建表语法详解 3.拓展1:复杂数据分割 4.拓展2:事务表 ...

  5. ALSA声卡驱动中的DAPM详解之四:在驱动程序中初始化并注册widget和route

    前几篇文章我们从dapm的数据结构入手,了解了代表音频控件的widget,代表连接路径的route以及用于连接两个widget的path.之前都是一些概念的讲解以及对数据结构中各个字段的说明,从本章开 ...

  6. Asp.net中GridView使用详解(引)【转】

    Asp.net中GridView使用详解(引) GridView无代码分页排序 GridView选中,编辑,取消,删除 GridView正反双向排序 GridView和下拉菜单DropDownList ...

  7. Linux中iptraf命令详解(IP局域网监控工具)

    2019独角兽企业重金招聘Python工程师标准>>> Linux中iptraf命令详解(IP局域网监控工具) 发布时间:2017-12-27 20:46:03   作者:佚名    ...

  8. ArcGIS Engine中的Symbols详解

    转自原文 ArcGIS Engine中的Symbols详解 本文由本人翻译ESRI官方帮助文档.尊重劳动成果,转载请注明来源. Symbols ArcObjects用了三种类型的Symbol(符号样式 ...

  9. js路由在php上面使用,React中路由使用详解

    这次给大家带来React中路由使用详解,React中路由使用的注意事项有哪些,下面就是实战案例,一起来看一下. 路由 通过 URL 映射到对应的功能实现,React 的路由使用要先引入 react-r ...

最新文章

  1. RemoveError: 'setuptools' is a dependency of conda and cannot be removed from
  2. AbstractReferenceCountedByteBuf源码分析
  3. WannaCry警示:学会检测和减轻云端恶意内容
  4. Python高级特性: 12步轻松搞定Python装饰器
  5. 图论 —— 生成树 —— 最小瓶颈生成树
  6. java怎样输出一个文件夹,java合并一个文件夹下所有txt文件,输出到另一个txt,...
  7. Java Spring 异常处理
  8. 工程管理 -- makefile
  9. 分享PMP真题回忆,出征软考高级项目管理师
  10. dB、dBm、dBw、dBμV、dBmV、dBV、dBv等单位介绍
  11. IT 面试常见IQ试题
  12. python node.js ruby_Python/Ruby/Node.js/Perl - 随笔分类 - bluefrog - 博客园
  13. ROS机器人建模与仿真(一)--URDF机器人建模
  14. mysql数据库完整实例-“汽车维修”
  15. 中级职称计算机excel 公式,中级职称计算机试Excel应用模拟题库.doc
  16. 某游戏公司测试工程师面试题
  17. 如何正确高效使用搜索引擎
  18. spark写 本地文件报错
  19. 【阅读论文】第五章--分割微动脉瘤--博-自动化眼底图像分析技术可筛查糖尿病患者的视网膜疾病
  20. This is My frist Webo Happy!!!

热门文章

  1. 描述卷积神经网络的结构,卷积神经网络三大特点
  2. Python操作Excel的Xlwings教程(五)
  3. 机器学习基础算法四:逻辑回归算法实验
  4. 基于域名访问的web站点发布+使用两个IP访问同一个网站
  5. NXP BootLoader源码分析并改写SD卡启动
  6. 《一本小小的蓝色逻辑书》读书笔记
  7. GoAhead4.1.0 开发总结一(移植)
  8. LabView_使用 Vision Acquisition 采集工业相机图像
  9. <视觉SLAM十四讲> ch7 视觉里程计1
  10. AI+遥感:释放每个像元价值