既に提供されている機能よりも多くの機能を提供する Hive 用の UDF を作成しようとしていsplit()
ます。
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 ファイルにエクスポートします。次に、それをHiveにロードします
add jar /path/to/myJar.jar;
を使用して関数を作成します
create temporary function lower_case as 'LowerCase';
String フィールドを含むテーブルがあります。ステートメントは次のとおりです。
select lower_case(text) from documents;
しかし今、私は配列を返す関数を作成したいと思っています (たとえば、split のように)。
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;
}
}
残念ながら、上記とまったく同じロード手順を実行すると、この機能は機能しません。次のエラーが表示されます。
FAILED: SemanticException java.lang.IllegalArgumentException: Error: name expected at the position 7 of 'struct<>' but '>' is found.
この種の変換について言及しているドキュメントが見つからないので、アドバイスをいただければ幸いです。