hive支持java写udf、udaf、udtf,可以用udf实现rownumber。
http://blog.sina.com.cn/s/blog_6ff05a2c0100tl36.html
http://blog.sina.com.cn/s/blog_6ff05a2c01017myn.html
使用例子:
hive> add jar/data/sysdir/hive-0.7.1/udf/hiveext.jar;
hive> createtemporary function rownumber as 'com.some.hive.RowNumber';
hive> select * from testlog;
1401 session1 url1 s1
1405 session2 url2 s2
1410 session1 url2 s2
1411 session2 url1 s1
1420 session2 url3 s2
hive> select dates,sessionid,url,s,rownumber(sessionid) from (select * from testlog distribute by sessionid sort by sessionid,dates) a;
1401 session1 url1 s1 1
1410 session1 url2 s2 2
1405 session2 url2 s2 1
1411 session2 url1 s1 2
1420 session2 url3 s2 3
package com.some.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++;
}
}
本文介绍了如何在Hive中利用Java编写UDF来实现rownumber功能。通过添加自定义jar包并创建临时函数,可以在查询时为每个sessionid分配行号,从而对数据进行排序和分组。

4242

被折叠的 条评论
为什么被折叠?



