文档章节

Hive分析函数row_number()

JackieYeah
 JackieYeah
发布于 2016/05/25 23:59
字数 337
阅读 9.9K
收藏 0

阿里云携手百名商业领袖、技术大咖,带您一探行进中的数字新基建!>>>

业务背景

最近有一个需求是给用户浏览的商品进行评分, 然后将商品评分按降序排序, 最后取 Top 50 推荐给终端用户。评分的计算公式为: 该商品一个月内的购买次数 / 该商品两个月内的浏览次数。在实现该需求的时候就用到了 Hive 中内置的分析函数 row_number()。

row_number()函数简介

row_number() 函数的简单用法如下:

ROW_NUMBER() OVER (DISTRIBUTE BY COLUMN_A SORT BY COLUMN_B ASC/DESC)

说明: DISTRIBUTE BY COLUMN_A 的意思是按照 COLUMN_A 进行分组, SORT BY COLUMN_B 的意思是按照 COLUMN_B 进行排序, 后面跟着 ASC/DESC 指定是按照升序还是降序排序。row_number() 按指定的列进行分组生成行序列, 从 1 开始, 如果两行记录的分组列相同, 则行序列+1。

需求实现

数据表 user_item_score 结构大致如下:

| user_id | item_id | item_score | | ----- |:---- :| ---- :| | U_AAAA | I_AAA1 | 0.5 | | U_BBBB | I_BBB1 | 0.3 | | U_AAAA | I_AAA2 | 0.6 | | U_CCCC | I_CCCC | 0.7 | | U_AAAA | I_AAA3 | 0.55 | | U_BBBB | I_BBB2 | 0.4 |

实现 SQL 如下:

select user_id, item_id, item_score from (
    select *, row_number() over ( distribute by user_id sort by item_score desc) rownum from user_item_score
) temp
where rownum <= 50;

最终结果如下:

| user_id | item_id | item_score | row_num | | ----- |:---- :| ---- :|---- :| | U_AAAA | I_AAA2 | 0.6 | 1 | | U_AAAA | I_AAA3 | 0.55 | 2 | | U_AAAA | I_AAA1 | 0.5 | 3 | | U_BBBB | I_BBB2 | 0.4 | 1 | | U_BBBB | I_BBB1 | 0.3 | 2 | | U_CCCC | I_CCCC | 0.7 | 1 |

© 著作权归作者所有

JackieYeah
粉丝 45
博文 70
码字总数 90004
作品 0
武汉
程序员
私信 提问
加载中

评论(0)

Hive表生成函数explode讲解

Hive中的表分析函数接受零个或多个输入,然后产生多列或多行输出。 1.explode函数 explode函数以array类型数据输入,然后对数组中的数据进行迭代,返回多行结果,一行一个数组元素值 ARRAY函...

osc_dl4yv4ox
2018/06/12
2
0
hive Spark SQL分析窗口函数

Spark1.4发布,支持了窗口分析函数(window functions)。 在离线平台中,90%以上的离线分析任务都是使用Hive实现,其中必然会使用很多窗口分析函数,如果SparkSQL支持窗口分析函数, 那么对于...

osc_1fuqrqut
2019/04/23
2
0
Oracle/Hive/Impala SQL比较

5 Function 指数据库内置的function,不讨论UDF。另外,操作符都不比较了,区别不大。 5.1 数学函数 功能 Oracle Hive Impala ABS 绝对值,有 有 有 SIN/SINH/ASIN/COS/COSH/ACOS/TAN/TANH/A...

hblt-j
2017/10/28
343
0
使用zipwithindex 算子给dataframe增加自增列 row_number函数实现自增,udf函数实现自增

DataFrame df = ... StructType schema = df.schema().add(DataTypes.createStructField("id", DataTypes.LongType, false)); 使用RDD的zipWithIndex得到索引,作为ID值: JavaRDD<Row> rdd......

osc_2xb14pj9
2019/09/03
2
0
Hive中笔记 :三种去重方法,distinct,group by与ROW_Number()窗口函数

一、distinct,group by与ROW_Number()窗口函数使用方法 1. Distinct用法:对select 后面所有字段去重,并不能只对一列去重。 (1)当distinct应用到多个字段的时候,distinct必须放在开头,其...

osc_6lgm3hxt
2018/11/21
4
0

没有更多内容

加载失败,请刷新页面

加载更多

web前端入门知识大全:系统路线,各类要点解析

一、WEB前端是什么? 使用HTML/CSS/JS以及更多的框架技术,编写网站页面、App应用、小程序、2D&3D游戏、Web VR&AR等应用,通过内容设计、交互动画、数据操作构建项目与用户的交互界面。前端开...

梦想编程
16分钟前
11
0
一个软件测试7年的程序员,讲述自己两年突破瓶颈的经验,关注这些能让你少走弯路。

突破自己的技术瓶颈并不是一蹴而就,还是需要看清楚一些东西,这里也有一些经验和见解跟大家分享一下。同样是职场人士,我也有我的经历和故事。在工作期间,我有过2年加薪7次的小小“战绩”(...

爱码小哥
26分钟前
8
0
ReentrantLock 读写锁

写写共享 读写互斥 写写互斥 适合读多的业务 提高效率 import java.util.concurrent.locks.ReentrantReadWriteLock;import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock;......

Joker上上签
28分钟前
13
0
IM即时通讯 时间处理1

function formatDate(now) { let date = new Date(now); let Y = date.getFullYear() + '-'; let M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getM......

lsy999
28分钟前
9
0
rust tokio mpsc 异步发送数据

启动两个异步任务,一个阻塞在键盘输入。一个间歇的读取通道,有数据就输出。在快速输入的时候会卡住,因为 mpsc 的 buffer 设置为了 5。 代码如下: use std::io;use tokio::task;use to...

Anunakee
29分钟前
16
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部