Java实现UDF函数
一、实现字符串到数字的转换
package com.easyrong.data.function;
import org.apache.hadoop.hive.ql.exec.UDF;
public class NumberToChar extends UDF{
public static int byteToInt(byte b) {
//Java 总是把 byte 当做有符处理;我们可以通过将其和 0xFF 进行二进制与得到它的无符值
return b & 0xFF;
}
public static String evaluate(String s) {
String ssb="";
char[] charArray = s.toCharArray();
for(int i=0;i<charArray.length;i++) {
int byteAscii = byteToInt((byte)charArray[i]);
ssb=ssb+""+byteAscii;
}
return ssb;
}
}
二、打Jar包
右击工程-export:
三、将jar上传到服务器
四、添加jar,并且创建临时函数
hive> add jar udf.jar;
Added [udf.jar] to class path
Added resources: [udf.jar]
hive> create temporary function NumberToChar as'com.easyrong.data.function.NumberToChar';
五、引用函数
hive> select student,course,score ,NumberToChar('adgatsyayahhjajajafjadsfsashgadfasd') from score;
OK
10 物理 120.0 9710010397116115121971219710410410697106971069710210697100115102115971151041039710010297115100
10 物理 120.0 9710010397116115121971219710410410697106971069710210697100115102115971151041039710010297115100
1 数学 100.0 9710010397116115121971219710410410697106971069710210697100115102115971151041039710010297115100
Python实现UDF函数
一、实现字符串到数字的转换
# coding=utf-8
import sys
lst = []
for line in sys.stdin:
line = line.strip()
for i in line:
lst.append(str(ord(i)))
print("".join(lst))
二、将.py文件上传服务器
三、调用函数
hive> select student,TRANSFORM ('sashgadfasd') USING "python NumberToChar.py" as (fname) from score;
注意:
使用transform的时候不能查询别的列,比如:
select a,trans(b,c)
using "python NumberToChar.py"
as(d,e)
from score
这样就是错的,不能选择a,如果需要a的话可以直接放到transform里,然后将其不作处理,直接输出即可。