impala1.2.3 udf問題
新しいimpalaはudfをサポートし、テスト環境に1.2.3バージョンのclusterを配備した.テストudfを実行中にjavaというエラーが発生しました.lang.IllegalArgumentException(メソッドに不正または不正なパラメータが渡されたことを示します.)これがバグであることを確認しました.https://issues.cloudera.org/browse/IMPALA-791The currently impala 1.2.3 doesn't support String as the input and return types. You'll instead have to use Text or BytesWritable.1.2.3バージョンのimpala udfの入力パラメータと戻り値はまだStringをサポートしていないので、import orgを使用することができる.apache.hadoop.io.StringTextのapiドキュメントに代わるTextクラス:http://hadoop.apache.org/docs/current/api/org/apache/hadoop/io/Text.html重要な点:Constructor:Text(String string)Construct from a string.Method:String toString() Convert text back to stringvoid set(String string) Set to contain the contents of a string.void set(Text other) copy a text.void clear()clear the string to emptyは、eclipseでTextクラスの使用方法をテストします.
テストudf:
いくつかの注意点:1.functionはdbに関連付けられています.2.jarファイルはhdfsに格納.functionはcatalogによってキャッシュされます
package com.hive.myudf;
import java.util.Arrays;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
import org.apache.hadoop.io.Text;
public class TextTest {
private static Text schemal = new Text( "http://");
private static Text t = new Text( "GET /vips-mobile/router.do?api_key=04e0dd9c76902b1bfc5c7b3bb4b1db92&app_version=1.8.7 HTTP/1.0");
private static Pattern p = null;
private static Matcher m = null;
public static void main(String[] args) {
p = Pattern. compile( "(.+?) +(.+?) (.+)");
Matcher m = p.matcher( t.toString());
if (m.matches()){
String tt = schemal +"test.test.com" +m.group(2);
System. out .println(tt);
//return m.group(2);
} else {
System. out .println("not match" );
//return null;
}
schemal .clear();
t.clear();
}
}
テストudf:
package com.hive.myudf;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text;
import org.apache.log4j.Logger;
public class UDFNginxParseUrl extends UDF {
private static final Logger LOG = Logger.getLogger(UDFNginxParseUrl.class);
private Text schemal = new Text("http://" );
private Pattern p1 = null;
private URL url = null;
private Pattern p = null;
private Text lastKey = null ;
private String rt;
public UDFNginxParseUrl() {
}
public Text evaluate(Text host1, Text urlStr, Text partToExtract) {
LOG.debug( "3args|args1:" + host1 +",args2:" + urlStr + ",args3:" + partToExtract);
System. out.println("3 args" );
System. out.println("args1:" + host1 +",args2:" + urlStr + ",args3:" + partToExtract);
if (host1 == null || urlStr == null || partToExtract == null) {
//return null;
return new Text("a" );
}
p1 = Pattern.compile("(.+?) +(.+?) (.+)" );
Matcher m1 = p1.matcher(urlStr.toString());
if (m1.matches()){
LOG.debug("into match" );
String realUrl = schemal.toString() + host1.toString() + m1.group(2);
Text realUrl1 = new Text(realUrl);
System. out.println("URL is " + realUrl1);
LOG.debug("realurl:" + realUrl1.toString());
try{
LOG.debug("into try" );
url = new URL(realUrl1.toString());
} catch (Exception e){
//return null;
LOG.debug("into exception" );
return new Text("b" );
}
}
if (partToExtract.equals( "HOST")) {
rt = url.getHost();
LOG.debug( "get host" + rt );
}
//return new Text(rt);
LOG.debug( "get what");
return new Text("rt" );
}
}
いくつかの注意点:1.functionはdbに関連付けられています.2.jarファイルはhdfsに格納.functionはcatalogによってキャッシュされます