LoginSignup
5
4

More than 5 years have passed since last update.

Hive de CSV(TSV) - UDF作るよ

Last updated at Posted at 2014-05-26

ということで前回、可変な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作るまでやったけど全然上級では無かったの巻。

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4