2015年07月14日

hiveでヘッダ付きのcsvファイルをテーブルにロードする

csvファイルをhiveに読ませる場合に、ヘッダが付いていたらどうするか。そのまま読み込ませるとヘッダ行も列に追加されてしまう。

hive0.13からはskip.header.line.countを指定して、行を飛ばせるらしい。ついでにフッタ行を飛ばす skip.footer.line.count もいるようだ。

下記、サンプルのcreate文。最後の行でtblpropertiesに1行ヘッダスキップする設定にしている。

create table foo (foo string, bar string, baz string)
row format delimited fields terminated by ',' lines terminated by '\n'
tblproperties ('skip.header.line.count'='1');

下記のようなcsvを読み込ませる。

foo,bar,baz
a,b,c
d,e,f
g,h,i
j,k,l
m,n,o

対象のcsvファイルをHDFSにputしておいてload dataでテーブルに取り込む。

$ hadoop fs -put foo.csv .
$ hive -e "load data inpath 'foo.csv' overwrite into table foo"

あとはSELECTして結果の1行目にヘッダ行(foo,bar,baz)がいなければ成功。

$ hive -e "select * from foo"

a	b	c
d	e	f
g	h	i
j	k	l
m	n	o

成功。