はじめに
hiveでサクっとcsvやtsvをテーブル化したい!という時にみる記事です。
目次
- csv,tsvの準備
- create tableする
- hdfsにデータを投下
- 備考
csv,tsvの準備
データを準備します。
cat data.csv
id,name,age
1,tarou,31
2,jirou,28
3,saburou,25
cat data.tsv
id name age
1 tarou 31
2 jirou 28
3 saburou 25
create tableする
locationをhdfsの任意のフォルダに指定して、createします。区切り文字の設定は投下するデータに合わせて変えましょう。
(FIELDS TERMINATED BY ...の箇所を変更しているのみです。)
csvを入れるテーブルの場合
CREATE TABLE testdb.testtable_csv
( id INT,
name STRING,
age INT
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
STORED AS TEXTFILE
LOCATION '/testfolder/testtable_csv/'
--任意のhdfs上のフォルダを指定(存在しないフォルダの場合、自動生成されます。)
TBLPROPERTIES
("skip.header.line.count"="1",
"serialization.null.format"="NULL")
;
tsvを入れるテーブルの場合
CREATE TABLE testdb.testtable_tsv
( id INT,
name STRING,
age INT
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\n'
STORED AS TEXTFILE
LOCATION '/testfolder/testtable_tsv/'
--任意のhdfs上のフォルダを指定(存在しないフォルダの場合、自動生成されます。)
TBLPROPERTIES
("skip.header.line.count"="1",
"serialization.null.format"="NULL")
;
hdfsにデータを投下
先程createしたテーブルのlocationにデータを入れます。
hdfs dfs -put ./data.csv /testfolder/testtable_csv
hdfs dfs -put ./data.tsv /testfolder/testtable_tsv
データを追加する場合も、そのままputで同じロケーションに入れればOKです。
hdfs dfs -put ./data2.csv /testfolder/testtable_csv
hdfs dfs -put ./data2.tsv /testfolder/testtable_tsv
既存データを別データに置換したい場合、-fオプションを使い、パス名に置換したいファイル名を指定してputします。
(こちらでは、data.csv、data.tsvをdata3.csv、data3.tsvに置換しています。)
hdfs dfs -put -f ./data3.csv /testfolder/testtable_csv/data.csv
hdfs dfs -put -f ./data3.tsv /testfolder/testtable_tsv/data.tsv
確認
selectなどでテーブルにデータが追加されているか確認します。
hive> select * from testdb.testtable_csv limit 10;
備考
データのファイル容量が大きい場合、hdfs dfs -putコマンドの実行にかなり時間がかかってしまうので、大きいデータを扱う際はLOAD文を使ったり、ファイルをsplitコマンドで分割してシェルスクリプトなどで順次投下したら良いかもと思いました。