복붙노트

[HADOOP] 배열에 하이브 UDF 텍스트

HADOOP

배열에 하이브 UDF 텍스트

이미 제공된 split () 함수보다 더 많은 기능을 제공하는 Hive 용 UDF를 만들려고합니다.

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

public class LowerCase extends UDF {

  public Text evaluate(final Text text) {
    return new Text(stemWord(text.toString()));
  }

  /**
   * Stems words to normal form.
   * 
   * @param word
   * @return Stemmed word.
   */
  private String stemWord(String word) {
    word = word.toLowerCase();
    // Remove special characters
    // Porter stemmer
    // ...
    return word;
  }
}

이것은 하이브에서 일하고 있습니다. 이 클래스를 jar 파일로 내 보냅니다. 그런 다음 하이브에로드합니다.

jar /path/to/myJar.jar를 추가하십시오.

다음을 사용하여 함수를 작성하십시오.

임시 함수 lower_case를 'LowerCase'로 생성하십시오.

나는 String 필드가있는 테이블을 가지고있다. 다음 문장은 다음과 같습니다.

문서에서 lower_case (텍스트)를 선택하십시오.

하지만 이제 배열을 반환하는 함수를 만들려고합니다 (예 : split does).

import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

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

public class WordSplit extends UDF {

  public Text[] evaluate(final Text text) {
    List<Text> splitList = new ArrayList<>();

    StringTokenizer tokenizer = new StringTokenizer(text.toString());

    while (tokenizer.hasMoreElements()) {
      Text word = new Text(stemWord((String) tokenizer.nextElement()));

      splitList.add(word);
    }

    return splitList.toArray(new Text[splitList.size()]);
  }

  /**
   * Stems words to normal form.
   * 
   * @param word
   * @return Stemmed word.
   */
  private String stemWord(String word) {
    word = word.toLowerCase();
    // Remove special characters
    // Porter stemmer
    // ...
    return word;
  }
}

불행히도이 기능은 위에서 언급 한 똑같은 로딩 절차를 수행하면 작동하지 않습니다. 다음과 같은 오류가 발생합니다.

실패 : SemanticException java.lang.IllegalArgumentException : 오류 : 'struct <>'의 위치 7에서 예상되는 이름이 있지만 '>'이 (가) 발견되었습니다.

이런 종류의 변환을 언급하는 문서를 찾지 못했기 때문에, 나에게 조언이 필요하기를 바란다.

해결법

  1. ==============================

    1.나는 'UDF'인터페이스가 당신이 원하는 것을 제공 할 것이라고 생각하지 않는다. GenericUDF를 사용하려고합니다. 분할 된 UDF의 소스를 가이드로 사용합니다.

    나는 'UDF'인터페이스가 당신이 원하는 것을 제공 할 것이라고 생각하지 않는다. GenericUDF를 사용하려고합니다. 분할 된 UDF의 소스를 가이드로 사용합니다.

    http://grepcode.com/file/repository.cloudera.com/content/repositories/releases/org.apache.hadoop.hive/hive-exec/0.7.1-cdh3u1/org/apache/hadoop/hive/ql/udf/generic/GenericUDFSplit.java

  2. ==============================

    2.실제로 'UDF'인터페이스는 배열 반환을 지원합니다.

    실제로 'UDF'인터페이스는 배열 반환을 지원합니다.

    Return ArrayList 또는 ArrayList 대신 Text []

    코드는 다음과 같아야합니다.

    import java.util.ArrayList;
    import java.util.List;
    import java.util.StringTokenizer;
    
    import org.apache.hadoop.hive.ql.exec.UDF;
    import org.apache.hadoop.io.Text;
    
    public class WordSplit extends UDF {
    
      public ArrayList<String> evaluate(final Text text) {
        ArrayList<String> splitList = new ArrayList<String>();
    
        StringTokenizer tokenizer = new StringTokenizer(text.toString());
    
        while (tokenizer.hasMoreElements()) {
          String word = stemWord((String) tokenizer.nextElement());
          splitList.add(word);
        }
        return splitList;
      }
    
      /**
       * Stems words to normal form.
       *
       * @param word
       * @return Stemmed word.
       */
      private String stemWord(String word) {
        word = word.toLowerCase();
        return word;
      }
    }
    
  3. from https://stackoverflow.com/questions/17137194/hive-udf-text-to-array by cc-by-sa and MIT license