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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 宝塔面板安装nginx失败_卸载宝塔网站防火墙

    宝塔面板安装nginx失败_卸载宝塔网站防火墙解压并转到目录下tar-zxvfnginx-1.9.15.tar.gzcdnginx-1.9.15设置一下配置信息./configure–prefix=/usr/local/nginx,或者不执行此步,直接默认配置编译安装makemakeinstallmake的过程是把各种语言写的源码文件,变成可执行文件和各种库文件;makeinstall是把这些编译出来的可执行文件和库文…

    2022年9月3日
  • java图片转二进制流_java将文件转化成二进制流

    java图片转二进制流_java将文件转化成二进制流二进制流的主要编码格式是base64码。可以在网上找一些在线转base64编码的网站进行尝试转换。例如:http://imgbase64.duoshitong.com/然后通过前端展现和下载。一、前端查看、下载功能实现前端显示二进制流图片(src中放置base64码及二进制流)<imgsrc=”http://dl.ppt123.net/pptbj/201603/2016030410235232.jpg”alt=””><imgsrc=”data:image/png;base

    2022年10月12日
  • Expression Web设计工具

    Expression Web设计工具

    2021年7月24日
  • CMPP讲解_cmpp2.0

    CMPP讲解_cmpp2.0  1 、缩略语解释  ISMG                         InternetShortMessageGateway     互联网短信网关

    2022年10月24日
  • Python用subprocess的Popen来调用系统命令

    Python用subprocess的Popen来调用系统命令

    2021年12月14日
  • windows下CMD常用命令[通俗易懂]

    windows下CMD常用命令[通俗易懂]作为一个开发者,我们用的最多的就是windows,但是对于cmd,我不知道大家熟不熟,反正我是一直不怎么熟悉。平时操作linux比较多,反而忽视了cmd相关命令,这里大致总结一些常用的命令,作为记录。一、常用命令1、进入某个盘//进入d盘D://进入F盘F:这里我经常弄混,老是用cd命令,结果回回进不去。。Linux和windows果然不一样。2、查看目录文件//查看当前目录下的文件,类似于l

    2022年9月22日

发表回复

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

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