Hive函数row_number实现[通俗易懂]

Hive函数row_number实现[通俗易懂]需求:查询一批用户最后三次登陆时间,ip数据row_number实现”’importorg.apache.hadoop.hive.ql.exec.UDF;publicclassRowNumberextendsUDF{privatestaticintMAX_VALUE=50;privatestaticStringcomparedColumn[]=newString[

大家好,又见面了,我是你们的朋友全栈君。

需求:

查询一批用户最后三次登陆时间,ip数据

理解需求是实现分组取前n个值,实现方式是先按照uid字段升序或倒序,时间字段倒序排序数据集合,然后遍历数据集合,用row_number函数遍历uid字段,相同则row_number值+1,取row_number<=3

row_number实现

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++;
    }
}

使用

add jar /xx/xx/user_function/mr-function-1.0.0.jar;
create temporary function row_number as 'com.xxx.xxx.RowNumber';

SELECT c.user_id,c.time,c.ip FROM (SELECT b.* FROM uids_20150831 a LEFT JOIN (SELECT * FROM login WHERE date >=20150101) b ON a.user_id = b.user_id distribute BY user_id sort BY user_id ASC,time DESC ) c WHERE row_number(c.user_id)<=3

参考:
http://blog.csdn.net/liuj2511981/article/details/8741276
http://blog.csdn.net/yfkiss/article/details/7885262
http://blog.csdn.net/yfkiss/article/details/7885262

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/140995.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • hdu 2648 Shopping

    hdu 2648 Shopping

    2021年8月26日
    53
  • 记 – PC视频播放最强画质教程(Potplayer + madVR)「建议收藏」

    记 – PC视频播放最强画质教程(Potplayer + madVR)「建议收藏」PC视频播放最强画质教程前言:本次使用到的软件/工具Potplayer播放器Potplayer是目前我用到的最好用的宝藏视频播放软件:内存占用低、无广告、支持视频格式多、功能强大、扩展性高、界面唯美(网上下载皮肤)。MADVR插件MADVR是一款超强的视频插件,其配合高清播放软件,可以做到目前PC上播放高清视频的最强画质。MADVR这款视频渲染器比市面上大多数播放器自带的渲染器有着更精确的颜色处理,更高质量的图像缩放缩放、以及更低的颜色错误率。这就使得它所渲染出来的视频在

    2022年9月14日
    0
  • H2数据库集群_数据库集群搭建

    H2数据库集群_数据库集群搭建H2数据库集群1.H2数据库简介1.1H2数据库优势常用的开源数据库:H2,Derby,HSQLDB,MySQL,PostgreSQL。其中H2,HSQLDB类似,十分适合作为嵌入式数据库使用,其它的数据库大部分都需要安装独立的客户端和服务器端。H2的优势:1、h2采用纯Java编写,因此不受平台的限制。2、h2只有一个jar文件,十分适合作为嵌入式数据库试用。3、性能和功能的优

    2022年10月12日
    0
  • 华中农业大学python实验题

    华中农业大学python实验题华中农业大学Python部分实验题,旨在为大家提供思路,希望大家抱着借鉴的心理来学习,不要直接抄袭。

    2022年7月11日
    9
  • poe交换机能连接普通交换机_两台poe交换机之间怎么连接

    poe交换机能连接普通交换机_两台poe交换机之间怎么连接PoE交换机的链接方式有哪些?前面我们在介绍监控的供电方式时有介绍PoE供电,有一些朋友对poe供电存到一些疑问,那么,交换机品牌16年生产厂家ONV光网视小编今天就用图文形式来与您一起了解PoE的几种供电方式和连接方法。交换机一、交换机和终端都支持PoE  这种方法PoE交换机直接通过网线接到支持PoE供电的无线AP和网络摄像机上,这种方法最简单,但也需要注意如下两点:  1、确定PoE…

    2022年10月4日
    0
  • anaconda conda 切换为国内源 、windows 和 Linux配置方法、 添加清华源——【一文读懂】

    anaconda conda 切换为国内源 、windows 和 Linux配置方法、 添加清华源——【一文读懂】请问下载过程非常卡怎么办,特别特别慢;请问为什么我搭建一个深度学习环境半个多小时都没成,而你10分钟就随手搭建一个环境讲道理?这就像搬砖,搬的久了,还不能允许我一天多拉几车吗

    2022年5月24日
    46

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号