hive関数UDF

1777 ワード

1.サンプルコード
 
package com.lixg.udf;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

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

public class GetCmsID extends UDF {

	public String evaluate(String url){
		String cmsid = null;
		if (url==null || "".equals(url)) {
			return cmsid;
		}
		Pattern pat = Pattern.compile("topicId=[0-9]+") ;
		Matcher matcher = pat.matcher(url);
		
		if (matcher.find()) {
			cmsid=matcher.group().split("topicId=")[1];
		}
		return cmsid;
	}
	
	public String evaluate(String pattern,String url){
		String cmsid = null;
		if (url==null || "".equals(url)) {
			return cmsid;
		}
		Pattern pat = Pattern.compile(pattern+"[0-9]+") ;
		Matcher matcher = pat.matcher(url);
		
		if (matcher.find()) {
			cmsid=matcher.group().split(pattern)[1];
		}
		return cmsid;
	}
	
	public static void main(String[] args) {
		String url="http://www.taobao.com/cms/view.do?topicId=18980";
		GetCmsID getCmsID = new GetCmsID();
		
		System.out.println(getCmsID.evaluate(url)) ;
		System.out.println(getCmsID.evaluate("cmsid=",url)) ;
	}

}

2.GetCmsIDとしてエクスポート.jar
3.運転
 
hive> add jar/usr/local/hivedemo/GetCmsID.jar;hive> create temporary function getCmsID as 'com.lixg.udf.GetCmsID';hive> select getCmsID(t.col1) from t limit 10;hive> drop temporary function getCmsID;備考:1.getCmsIDは一時的な関数であるため、hiveに入るたびにadd jarおよびcreate temporary操作が必要となる.UDFは一進一出の動作しか実現できないが、多進一出を実現する必要がある場合はUDAFを実現する必要がある