当前位置: 首页 > news >正文

hive-udf

--指数化处理

热度*(π-1.8),然后四舍五入后分段 分段规则:<=50(1/),>50&<=100(10/),>100&<=1000(30/),>1000&<=5000(100/),>50001000/段)】向上取段

 

结果在50以下的 ,每1为一个段

结果在50-100之间的,每10为一个段,

结果在1001000之间的,每30为一个段

结果在10005000之间,每100为一个段

结果在5000以上,每1000为一个段

 

所有分段指数向上取

若搜索量为0,默认处理结果是1.34,四舍五入后为1,向上取段后为1

若搜索量为1,热度*(π-1.8)的处理结果是1.34,四舍五入后为1,向上取段后为1

若搜索量为40,热度*(π-1.8)的处理结果是53.6,四舍五入后为54,向上取段为60

依次类推


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

/**
 * TODO Comment of UDFIndexation Function: UDFIndexation() Sample :
 * UDFIndexation(pv) return the indexation of the pv num
 * 
 * @author pengxuan.lipx
 */

public class UDFIndexation extends UDF {

    public long evaluate(long arguments, String varValues, String grade, String index) {

        long indexResult = 1L;
        long indexResult1 = 0L;

        String[] varValuesStr = varValues.replace(" ", "").split(",");
        double paiValue = Double.parseDouble(varValuesStr[0]);
        double indexValue = Double.parseDouble(varValuesStr[1]);

        String[] gradeStr = grade.replace(" ", "").split(",");

        long[] gradeDle = new long[gradeStr.length];
        for (int i = 0; i < gradeStr.length; i++) {
            gradeDle[i] = Long.parseLong(gradeStr[i]);
        }

        String[] indexStr = index.replace(" ", "").split(",");
        int[] indexDle = new int[indexStr.length];
        for (int i = 0; i < indexStr.length; i++) {
            indexDle[i] = Integer.parseInt(indexStr[i]);
        }

        indexResult1 = (long) Math.round(arguments * (paiValue - indexValue));
        System.out.println(arguments * (paiValue - indexValue));

        for (int i = 0; i < gradeDle.length - 1; i++) {
            if (gradeDle[i] < indexResult1 && indexResult1 <= gradeDle[i + 1]) {
                indexResult = UDFIndexation.roundedUp(indexResult1, indexDle[i]);
            } else if (gradeDle[i + 1] < indexResult1) {
                indexResult = UDFIndexation.roundedUp(indexResult1, indexDle[i + 1]);
            }
        }

        return indexResult;
    }

    public static long roundedUp(long roundedArg, int median) {
        if (roundedArg % median == 0) {
            return (long) Math.floor(roundedArg / median) * median;
        }
        return (long) Math.floor((roundedArg + median) / median) * median;
    }

    /**
     * @param args
     */
    public static void main(String[] args) {

        // TODO Auto-generated method stub
        UDFIndexation udfin = new UDFIndexation();
        //System.out.println(udfin.evaluate(new String("3590")));
        //System.out.println(udfin.evaluate(new Object()));
        //System.out.println(udfin.evaluate(500));
        //System.out.println(udfin.evaluate(""));
        //System.out.println(udfin.evaluate(new LongWritable(0)));
        long argtest = 1000;
        String varValues = "3.14, 1.8";
        String grade = "0, 50, 100, 1000, 5000";
        String index = "1, 10, 30, 100, 1000";
        System.out.println(udfin.evaluate(argtest, varValues, grade, index));
    }

}

1、UDF函数可以直接应用于select语句,对查询结构做格式化处理后,再输出内容。

2、编写UDF函数的时候需要注意一下几点:

a)自定义UDF需要继承org.apache.hadoop.hive.ql.UDF。

b)需要实现evaluate方法。

c)evaluate函数支持重载。

3.写udf类

4、应用

a)把程序打包放到目标机器上去;

b)进入hive客户端,添加jar包:hive>addjar /run/jar/udf_test.jar;

c)创建临时函数:

add jar /home/dwapp/pengxuan.lipx/hive_scripts/udfindex.jar;
add jar /dhwdata/hadoop/hadoop-0.19.2-core.jar;
add jar /dhwdata/hive/lib/hive-exec.jar;

CREATE TEMPORARY FUNCTION indexation AS 'com.alibaba.hive.udf.lpxuan.UDFIndexation';

d)查询HQL语句:
select indexation(500,'3.14, 1.8','0, 50, 100, 1000, 5000','1, 10, 30, 100, 1000') from dual;


相关文章:

  • java的IO详解
  • Hadoop如何计算map数和reduce数
  • hive源码解析(1)之hive执行过程
  • java面试(五)
  • hive源码解析(2)之编译前序
  • eCharts.js使用心得
  • ABAP POH和POV事件中 获得屏幕字段的值
  • Hive优化(2)之系统评估reduce数为1的MR Job优化
  • RecycleView + SwipeRefreshLayout 实现下拉刷新和底部自动加载
  • hive中间接实现不等值连接
  • python之字符编码
  • Hadoop计算文件大小
  • 在Oracle中利用SQL_TRACE跟踪SQL的执行
  • Linux添加/删除用户和用户组
  • Hive优化(3)之随机数避免数据倾斜
  • 分享的文章《人生如棋》
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • axios 和 cookie 的那些事
  • es的写入过程
  • Facebook AccountKit 接入的坑点
  • JS实现简单的MVC模式开发小游戏
  • Promise面试题,控制异步流程
  • python_bomb----数据类型总结
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 前端性能优化——回流与重绘
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 使用 QuickBI 搭建酷炫可视化分析
  • 微服务入门【系列视频课程】
  • 一天一个设计模式之JS实现——适配器模式
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • # Java NIO(一)FileChannel
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #NOIP 2014#day.2 T1 无限网络发射器选址
  • (26)4.7 字符函数和字符串函数
  • (四)Linux Shell编程——输入输出重定向
  • (算法二)滑动窗口
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • (转)德国人的记事本
  • (转)可以带来幸福的一本书
  • (转)拼包函数及网络封包的异常处理(含代码)
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .net framework4与其client profile版本的区别
  • .NET(C#) Internals: as a developer, .net framework in my eyes
  • .Net7 环境安装配置
  • .net对接阿里云CSB服务
  • .NET设计模式(8):适配器模式(Adapter Pattern)