Welcome 微信登录

首页 / 数据库 / MySQL / Hive中使用自定义函数(UDF)实现分析函数row_number的功能

之前部门实现row_number是使用的transform,我觉得用UDF实现后,平时的使用会更方便,免去了transform相对繁琐的语法。    用到的测试表为:hive> desc row_number_test;
OK
id1   int
id2   string
age   int
score double
name    string hive> select * from row_number_test;
OK
2     t04   25      60.0    youlia
1     t01   20      85.0    liujiannan
1     t02   24      70.0    zengqiu
2     t03   30      88.0    hongqu
2     t03   27      70.0    yongqi
1     t02   19      75.0    wangdong
1     t02   24      70.0    zengqiu 使用时要先在子查询中进行分区与排序,比如Oracle中这样一句SQL:select row_number() over (partition by id1 order by age desc) from row_number_test;转换为hive语句应该是:select row_number(id1) from --partition by的字段传到row_number函数中去    (select * from row_number_test distribute by id1 sort by id1,age desc) a; 如果partition by 两个字段:select row_number() over (partition by id1,id2 order by score) from row_number_test;转换为hive语句应该是:select row_number(id1,id2) --partition by的字段传到row_number函数中去    from (select * from row_number_test distribute by id1,id2 sort by id1,id2,score) a; 展示一下查询结果:1.select id1,id2,age,score,name,row_number(id1) rn from (select * from row_number_test distribute by id1 sort by id1,age desc) a; OK
2     t03   30      88.0    hongqu          1
2     t03   27      70.0    yongqi          2
2     t04   25      60.0    youlia          3
1     t02   24      70.0    zengqiu       1
1     t02   24      70.0    zengqiu       2
1     t01   20      85.0    liujiannan      3
1     t02   19      75.0    wangdong        4 2.select id1,id2,age,score,name,row_number(id1,id2) rn from (select * from row_number_test distribute by id1,id2 sort by id1,id2,score) a; OK
2     t04   25      60.0    youlia          1
1     t02   24      70.0    zengqiu       1
2     t03   27      70.0    yongqi          1
1     t02   24      70.0    zengqiu       2
1     t02   19      75.0    wangdong        3
1     t01   20      85.0    liujiannan      1
2     t03   30      88.0    hongqu          2 下面是代码,只实现了接收1个参数和2个参数的evaluator方法,参数再多的照搬代码就可以了,代码仅供参考:package com.Hadoopbook.hive;import org.apache.hadoop.hive.ql.exec.UDF;import org.apache.hadoop.hive.ql.udf.UDFType;@UDFType(deterministic = false)public class Row_number 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++;}public static void main(String args[]){Row_number t = new Row_number();System.out.println(t.evaluate(123));System.out.println(t.evaluate(123));System.out.println(t.evaluate(123));System.out.println(t.evaluate(1234));System.out.println(t.evaluate(1234));System.out.println(t.evaluate(1234));System.out.println(t.evaluate(1235));}}Hive 的详细介绍:请点这里
Hive 的下载地址:请点这里相关阅读:基于Hadoop集群的Hive安装 http://www.linuxidc.com/Linux/2013-07/87952.htmHive内表和外表的区别 http://www.linuxidc.com/Linux/2013-07/87313.htmHadoop + Hive + Map +reduce 集群安装部署 http://www.linuxidc.com/Linux/2013-07/86959.htmHive本地独立模式安装 http://www.linuxidc.com/Linux/2013-06/86104.htmHive学习之WordCount单词统计 http://www.linuxidc.com/Linux/2013-04/82874.htm[Hive]编写non-deterministic的UDF时遇到的谓词下推(Predicate pushdown)错误分析Hive中表的关联顺序对生成MapReduce作业数的影响案例相关资讯      Hive  Hive udf 
  • Hive 简明教程 PDF  (今 09:40)
  • Apache Hive v2.1.0-rc1 发布下载  (06月04日)
  • 在 Apache Hive 中轻松生存的12个  (04月07日)
  • Apache Hive v2.1.0 发布下载  (06月22日)
  • SparkSQL读取Hive中的数据  (05月20日)
  • Apache Hive 2.0.0 发布下载,数据  (02月17日)
本文评论 查看全部评论 (0)
表情: 姓名: 字数