impala1.2.3 udf問題

3968 ワード

新しい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クラスの使用方法をテストします.
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によってキャッシュされます