背景

假设有一个学生各门课的成绩的表单,应用hive取出每科成绩前100名的学生成绩。

这个就是典型在分组取Top N的需求。

解决思路

对于取出每科成绩前100名的学生成绩,针对学生成绩表,根据学科,成绩做order

by排序,然后对排序后的成绩,执行自定义函数row_number(),必须带一个或者多个列参数,如ROW_NUMBER(col1,

....),它的作用是按指定的列进行分组生成行序列。在ROW_NUMBER(a,b)

时,若两条记录的a,b列相同,则行序列+1,否则重新计数。

只要返回row_number()返回值小于100的的成绩记录,就可以返回每个单科成绩前一百的学生

Sql代码  

create table score_table (

subject string,

student string,

score int

)

partitioned by (date string);

如果要查询2012年每科成绩前100的学生成绩,sql如下

Java代码  

create temporary function row_number as 'com.blue.hive.udf.RowNumber';

select subject,score,student from

(select subject,score,student from score where dt='2012' order by subject,socre desc) order_score

where row_number(subject) <= 100;

com.blue.hive.udf.RowNumber是自定义函数,函数的作用是按指定的列进行分组生成行序列。这里根据每个科目的所有成绩,生成序列,序列值从1开始自增。

执行row_number函数,返回值如下

科目 成绩 学生 row_number

物理 100 张一 1

物理 90 张二 2

物理 80 张三 3

.....

数学 100 李一 1

数学 90 李二 2

数学 80 李三 3

....

row_number的源码

函数row_number(),必须带一个或者多个列参数,如ROW_NUMBER(col1,

....),它的作用是按指定的列进行分组生成行序列。在ROW_NUMBER(a,b)

时,若两条记录的a,b列相同,则行序列+1,否则重新计数。

package com.blue.hive.udf;

import org.apache.hadoop.hive.ql.exec.UDF;

public class RowNumber extends UDF {

private static int MAX_VALUE = 50;

private static String comparedColumn[] = new String[MAX_VALUE];

private static int rowNum = 1;

public int evaluate(Object... args) {

String columnValue[] = new String[args.length];

for (int i = 0; i < args.length; i++) 『

columnValue[i] = args[i].toString();

}

if (rowNum == 1) {

for (int i = 0; i < columnValue.length; i++)

comparedColumn[i] = columnValue[i];

}

for (int i = 0; i < columnValue.length; i++) {

if (!comparedColumn[i].equals(columnValue[i])) {

for (int j = 0; j < columnValue.length; j++) {

comparedColumn[j] = columnValue[j];

}

rowNum = 1;

return rowNum++;

}

}

return rowNum++;

}

}

编译后,打包成一个jar包,如/usr/local/hive/udf/blueudf.jar

然后在hive shell下使用,如下:

add jar /usr/local/hive/udf/blueudf.jar;

create temporary function row_number as 'com.blue.hive.udf.RowNumber';

select subject,score,student from

(select subject,score,student from score where dt='2012' order by subject,socre desc) order_score

where row_number(subject) <= 100;

同样,这个函数可以用作去重操作。

可以替代大批量数据的DISTINCT

通过执行如:

select * from(

select type,value,row_number() as rn

from

log_table distribute by type,value

sort by type,value

)

where rn = 1;

===============注意!============================

但是使用row_number()函数需要注意一点,必须使用sort

by。

测试的时候必须使用order by。

row_number()函数会假设数据有序的基础上进行的。

hive udf 分组取top1_Hive中分组取前N个值的实现-row_number()相关推荐

  1. oracle求和分组排序,oracle中分组排序函数用法 - 转

    项目开发中,我们有时会碰到需要分组排序来解决问题的情况,如:1.要求取出按field1分组后,并在每组中按照field2排序:2.亦或更加要求取出1中已经分组排序好的前多少行的数据 这里通过一张表的示 ...

  2. PHP抓取页面中a标签的href属性值以及a中间内容

    $str = file_get_contents($zh_cn_url); $reg1='/<a href=\"(.*?)\".*?>(.*?)<\/a>/ ...

  3. sql中向下取整怎么取_SQL中的取整函数、取小数

    取整函数: 1.trunc(value,precision)按精度(precision)截取某个数字,不进行舍入操作. 返回截尾到y位小数的x值:trunc(x,[y]): select trunc( ...

  4. python绘制分组条形图_python中分组值的条形图

    数据生成:我使用以下代码随机生成您的数据:import numpy as np import pandas as pd # The number of demo data count demo_num ...

  5. sql中向下取整怎么取_SQL中的取整函数FLOOR、ROUND、CEIL、TRUNC、SIGN

    1 trunc(value,precision)按精度(precision)截取某个数字,不进行舍入操作. 2 round(value,precision)根据给定的精度(precision)输入数值 ...

  6. hive udf 分组取top1_Hive的经典面试题

    很久没有发文章了,今天发表一下Hive的总结,如果那里有不足的欢迎指正,顺便再提一个问题(数仓建模中:细化程度越高,粒度级就越小,相反,细化程度越低,粒度级就越大,这个说法能打个比方比喻出来吗?) 必 ...

  7. hive中分组取前N个值的实现

    背景 假设有一个学生各门课的成绩的表单,应用hive取出每科成绩前100名的学生成绩. 这个就是典型在分组取Top N的需求. 解决思路 对于取出每科成绩前100名的学生成绩,针对学生成绩表,根据学科 ...

  8. Hive中分组取前N个值

    分享两篇文章,结合看更清楚一点. 背景 假设有一个学生各门课的成绩的表单,应用hive取出每科成绩前100名的学生成绩. 这个就是典型在分组取Top N的需求. 解决思路 对于取出每科成绩前100名的 ...

  9. hive udf 分组取top1_项目实战从0到1之hive(27)数仓项目(九)数仓搭建 DWS 层

    点击上方蓝字关注我们 一.数仓搭建 - DWS 层 1.1 业务术语 1)用户 用户以设备为判断标准,在移动统计中,每个独立设备认为是一个独立用户.Android 系统根据 IMEI 号,IOS 系统 ...

最新文章

  1. 华章7-8月份新书简介(2018年)
  2. OS- -请求分页系统、请求分段系统和请求段页式系统(一)
  3. .net 实时通信_基于 RabbitMQ 的实时消息推送
  4. Java消息队列总结只需一篇解决ActiveMQ、RabbitMQ、ZeroMQ、Kafka
  5. 2_RabbitMQ工作模式_Work queues_Publish/Subscribe_Routing_Topics_HeaderRpc
  6. 后台原理_电气控制原理动图22张,超赞!
  7. python如何导入numpy简书_如何使用python3.x成功导入numpy?
  8. 华为云提供多场景本地数据上云方案,数据上云不再愁
  9. javascript移动设备触屏事件
  10. 实习踩坑之路:利用Java8新特性实现不同范型List之间的相互转换
  11. paip.双网卡多网卡不能上网的联网配置
  12. StretchBlt()函数
  13. python爬虫轻松下载某易云音乐
  14. NPOI SetRowBreak 插入分页符无用
  15. 电路设计_继电器的电磁干扰
  16. 英特尔DAOS分布式异步存储系统
  17. uni.getUserProfile报错:fail can only be invoked by user TAP gesture
  18. eclipse如何配置工作环境
  19. Bootstrap自定义上传文件图标样式并使用ajax及formData进行上传
  20. DeepSort论文学习

热门文章

  1. python idle运行anaconda_在Python IDLE 下调用anaconda中的库教程
  2. python获取依赖包和安装依赖包
  3. QT+OpenCV综合示例:载入、读取图片
  4. PyTorch框架学习十九——模型加载与保存
  5. python .py文件变为.so文件进行加密
  6. 图像处理中的通信原理——冈萨雷斯读书笔记(三)
  7. 奇妙的安全旅行之RSA算法
  8. 使用IDA Pro动态调试SO文件
  9. 用matlab抽样定理验证,MATLAB抽样定理验证.docx
  10. 现代软件工程 第十一章 【软件设计与实现】 练习与讨论