[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.나는 '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.실제로 '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; } }
from https://stackoverflow.com/questions/17137194/hive-udf-text-to-array by cc-by-sa and MIT license
'HADOOP' 카테고리의 다른 글
[HADOOP] 이상한 DNS 서버로 인해 Hadoop 및 HBase가 오작동 함 (0) | 2019.06.17 |
---|---|
[HADOOP] 사용자 정의 키 및 값 : CompareTo () 메서드 작성 방법 (0) | 2019.06.17 |
[HADOOP] 스파크 스트리밍 : HDFS (0) | 2019.06.17 |
[HADOOP] hadoop mapreduce / yarn에서 VCORES를 설정하는 방법은 무엇입니까? (0) | 2019.06.17 |
[HADOOP] Hadoop Hive가 소스를 목적지로 이동할 수 없음 (0) | 2019.06.17 |