Hive之UDF實現

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裏,然後將其不作處理,直接輸出即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章