ということで前回、可変なCSVを処理するにあたって、ARRAY処理がどうにもならなかったのでいよいよUDFに手を出してみた。
現在のHiveではARRAYを処理するにあたって配列の添字を動的な別カラムの値だったり、動的な値を使ってアクセス出来ないようなので、独自にUDFを作る必要があるとのこと。
https://issues.apache.org/jira/browse/HIVE-1955
実装
こんな感じの実装でJarを作る。
ArrayStringToStringUDF.java
import java.util.List;
import org.apache.hadoop.hive.ql.exec.UDF;
public class ArrayStringToStringUDF extends UDF{
public String evaluate(List<String> values, int num){
if(values == null || values.size() < num + 1){
return null;
}
return values.get(num);
}
}
仕組みは全然難しいものでは無かった。むしろ簡単。
登録
add jar(もしくはhive-site.xmlで読み込み)した上で、下記のようにしてUDFを登録
create temporary function arraystring as 'net.jp.unk.hive.udf.ArrayStringToStringUDF';
実践
前回どうにもならなかった下記のデータセットで試してみる
test.csv
1,HOGE,HUGA,HIGE
2,HIGE,HOHO,HIHI
2,HIHI,HOHO,HIGE
0,HUHU,HUHU,HOGE
テーブル作成
create table csv_test(
items ARRAY<string>
)
ROW FORMAT DELIMITED
COLLECTION ITEMS TERMINATED BY ',';
データ読み込み
LOAD DATA LOCAL INPATH 'test.csv' INTO TABLE csv_test;
HQLを書いてみる
select arraystring(items,cast(items[0] as int) + 1) from csv_test;
結果
HUGA
HIHI
HIGE
HUHU
ということでとりあえず出来た(・∀・)
UDF作るまでやったけど全然上級では無かったの巻。