実データで覚える Treasure Client コマンドラインリファンス 〜3.Data Processing〜
本シリーズではTreasure Client ツールのコマンドラインリファレンスを以下の5つのレイヤーに分解し,各々について解説していくものとします。
No. | レイヤー | コマンド |
---|---|---|
1. | Data Import |
one-time import bulk import |
2. | Data Management |
db table |
3. | Data Processing |
schema query job |
4. | Data Scheduling |
sched result |
5. | Other |
help status server sample |
本日は 3. Data Processing に関するコマンドを紹介します。
1. schema コマンド
schema コマンドはインポートしたテーブルの各カラムに正確なスキーマを割り振ることでデータの質とパフォーマンスを上げるコマンドです。
$ td help schema
Additional commands, type "td help COMMAND" for more details:
schema:show <db> <table> # Show schema of a table
schema:set <db> <table> [columns...] # Set new schema on a table
schema:add <db> <table> <columns...> # Add new columns to a table
schema:remove <db> <table> <columns...> # Remove columns from a table
スキーマを設定すると以下の様に td tables $table_name コマンドでテーブル内の各カラムに型が割り振られていることがわかります。
スキーマを設定することでクエリの記述が異なります。スキーマを設定しない場合はカラムへのアクセスが v['$column_name'] と記述する必要がありましたが,設定後は $column_name の記述が可能になります。
それではスキーマを設定してみます。
$ td schema:set carsensor brand_master country_name:string country_code:string name:string code:string
$ td schema:set carsensor body_master name:string code:string
$ td schema:set carsensor catalog body_code:string body_name:string code:string desc:string grade:string height:int length:int model:string name:string period:string person:int price:int series:string width:int
$ td schema:set carsensor color_master name:string code:string
$ td schema:set carsensor country_master name:string code:string
$ td schema:set carsensor large_area_master name:string code:int
$ td schema:set carsensor pref_master name:string code:int large_area_name:string large_area_code:int
$ td schema:set carsensor usedcar carsensor usedcar body_name:string code:string color:string desc:string engine:string grade:string id:string inspection:string main_caption:string main_photo_l:string main_photo_s:string maintenance:string maintenance_comment:string maintenance_fee:string model:string name:string odd:string odd_km:int price:string recycle:string shop_datum:string shop_lat:float shop_lng:float shop_name:string shop_pref_code:int shop_pref_name:string url_mobile:string url_pc:string url_qr:string warranty:string warranty_comment:string warranty_distance:string warranty_fee:string warranty_length:string warranty_length_kigen:string warranty_length_kikan:string year:int
$ td schema:set carsensor usedcar_cube_without_catalog id:string name:string model:string body_name:string color:string engine:string grade:string inspection:string recycle:string year:int country_name:string used_price:string large_area_name:string shop_pref_name:string shop_lat:double shop_lng:double shop_name:string shop_pref_code:int maintenance:string maintenance_fee:string odd:string odd_numerics:double odd_unit:string odd_km:double warranty:string warranty_distance:string warranty_fee:string warranty_length_kigen:string warranty_length_kikan:string warranty_length_kikan_m:string main_photo_l:string desc:string
$ td schema:set carsensor usedcar_cube_with_catalog id:string name:string model:string body_name:string color:string engine:string grade:string grade_seq:long inspection:string recycle:string year_ym:int start_ym:int end_ym:int country_name:string series:string person:int height:int length:int width:int used_price:string new_price:int large_area_name:string shop_pref_name:string shop_lat:double shop_lng:double shop_name:string shop_pref_code:int maintenance:string maintenance_fee:string odd:string odd_numerics:double odd_unit:string odd_km:double warranty:string warranty_distance:string warranty_fee:string warranty_length_kigen:string warranty_length_kikan:string warranty_length_kikan_m:string main_photo_l:string desc:string
$ td schema:show carsensor brand_master
で設定されているスキーマを確認できます。
2. query コマンド
query コマンドは記述したクエリを実行するコマンドです。
$ td help query
usage:
$ td query [sql]
example:
$ td query -d example_db -w -r rset1 "select count(*) from table1"
$ td query -d example_db -w -r rset1 -q query.txt
description:
Issue a query
options:
-d, --database DB_NAME use the database (required)
-w, --wait wait for finishing the job
-G, --vertical use vertical table to show results
-o, --output PATH write result to the file
-f, --format FORMAT format of the result to write to the file (tsv, csv, json or msgpack)
-r, --result RESULT_URL write result to the URL (see also result:create subcommand)
-u, --user NAME set user name for the result URL
-p, --password ask password for the result URL
-P, --priority PRIORITY set priority
-R, --retry COUNT automatic retrying count
-q, --query PATH use file instead of inline query
-T, --type TYPE set query type (hive or pig)
--sampling DENOMINATOR enable random sampling to reduce records 1/DENOMINATOR
-x, --exclude do not automatically retrieve the job result
頻繁に使用するオプションは
- -w: 結果が返って来るまで待機
- -o: 保存先を指定
- -f: 出力フォーマットを指定
- -q: クエリを記述したファイル名を指定
以下の2パターンを覚えていれば十分でしょう。
$ td query -w -d carsensor -q "scatter.sql" -f csv -o "scatter.csv" # -o で指定したファイルに scatter.sql クエリの実行
$ td query -w -d carsensor -q "scatter.sql" "SELECT v FROM usedcar LIMIT 10" # コンソール出力
3. job コマンド
job コマンドは query で実行中ジョブや終了したジョブを参照するコマンドです。このコマンドでジョブの
- 進捗
- 成功 / 失敗
- 結果の取得
を確認することができます。終了済のジョブを指定してその結果を取得するには,
$ td jobs
+---------+---------+---------------------------+---------------+----------+--------+--------+------------------+--------------------------+
| JobID | Status | Start | Elapsed | Priority | Result | Type | Database | Query |
+---------+---------+---------------------------+---------------+----------+--------+--------+------------------+--------------------------+
| 7522693 | success | 2014-02-04 01:37:47 +0900 | 28sec | NORMAL | | hive | pos_toshiba_tech | SELECT * FROM joined_... |
| 7522617 | success | 2014-02-04 01:33:46 +0900 | 17sec | NORMAL | | hive | pos_toshiba_tech | SELECT * FROM joined_... |
| 7522465 | success | 2014-02-04 01:24:22 +0900 | 31sec | NORMAL | | hive | pos_toshiba_tech | SELECT * FROM joined_... |
| 7521447 | success | 2014-02-04 00:47:43 +0900 | 31sec | NORMAL | | hive | pos_toshiba_tech | SELECT * FROM joined_... |
| 7521415 | success | 2014-02-04 00:42:39 +0900 | 38sec | NORMAL | | hive | pos_toshiba_tech | SELECT * FROM transac... |
| 7521403 | success | 2014-02-04 00:41:05 +0900 | 48sec | NORMAL | | hive | pos_toshiba_tech | SELECT * FROM transac... |
| 7521380 | success | 2014-02-04 00:39:15 +0900 | 52sec | NORMAL | | hive | pos_toshiba_tech | SELECT * FROM transac... |
| 7521264 | success | 2014-02-04 00:29:05 +0900 | 45sec | NORMAL | | hive | pos_toshiba_tech | SELECT * FROM transac... |
| 7521256 | success | 2014-02-04 00:26:41 +0900 | 44sec | NORMAL | | hive | pos_toshiba_tech | SELECT * FROM transac... |
| 7521235 | success | 2014-02-04 00:23:05 +0900 | 46sec | NORMAL | | hive | pos_toshiba_tech | SELECT * FROM transac... |
| 7521004 | error | 2014-02-04 00:07:01 +0900 | 15sec | NORMAL | | hive | pos_toshiba_tech | SELECT v[ plu_meishou... |
+---------+---------+---------------------------+---------------+----------+--------+--------+------------------+--------------------------+
20 rows in set
実データで覚える Treasure Client コマンドラインリファンス 〜2.Data Management〜
本シリーズではTreasure Client ツールのコマンドラインリファレンスを以下の5つのレイヤーに分解し,各々について解説していくものとします。
No. | レイヤー | コマンド |
---|---|---|
1. | Data Import |
one-time import bulk import |
2. | Data Management |
db table |
3. | Data Processing |
schema query job |
4. | Data Scheduling |
sched result |
5. | Other |
help status server sample |
本日は 2. Data Management を紹介します。本シリーズでは実際にデータを使用して,その分析の流れに沿いながらコマンドラインを紹介していきます。実際に手を動かすためには,前回(1. Data Import) を参考にデータのインポートをお願いします。
1. db コマンド
db コマンドは現在存在する database の確認および追加削除ができる一般的なコマンドです。
$ td help db
Additional commands, type "td help COMMAND" for more details:
db:list # Show list of tables in a database
db:show <db> # Describe information of a database
db:create <db> # Create a database
db:delete <db> # Delete a database
前回は db名: "carsensor" を作りましたので,その中にあるテーブルを見てみましょう。
$ td db:list
+------------------------------+------------+
| Name | Count |
+------------------------------+------------+
| book_crossing_dataset | 1700014 |
| carsensor | 395927 |
+------------------------------+------------+
$ td db:show carsensor
+-------------------+------+--------+--------------------------------------------------------------------------+
| Table | Type | Count | Schema |
+-------------------+------+--------+--------------------------------------------------------------------------+
| body_master | log | 10 | name:string, code:string |
| brand_master | log | 149 | |
| catalog | log | 84633 | |
| color_master | log | 16 | name:string, code:string |
| country_master | log | 20 | name:string, code:string |
| large_area_master | log | 9 | name:string, code:string |
| pref_master | log | 47 | name:string, large_area_name:string, code:string, large_area_code:string |
| usedcar | log | 311043 | |
+-------------------+------+--------+--------------------------------------------------------------------------+
Schema はテーブル内のデータカラムの型を指定しているものです。Schema の話は次回で紹介します。
2. table コマンド
table コマンドは特定の db に存在するテーブルを確認,および操作するものです。
$ td help table td table help
Additional commands, type "td help COMMAND" for more details:
table:list [db] # Show list of tables
table:show <db> <table> # Describe information of a table
table:create <db> <table> # Create a table
table:delete <db> <table> # Delete a table
table:import <db> <table> <files...> # Parse and import files to a table
table:export <db> <table> # Dump logs in a table to the specified storage
table:swap <db> <table1> <table2> # Swap names of two tables
table:tail <db> <table> # Get recently imported logs
table:partial_delete <db> <table> # Delete logs from the table within the specified time range
table:expire <db> <table> <expire_days> # Expire data in table after specified number of days
ここでは以下のコマンドは別セクションに譲るものとします:
- table:import → Data Import
- table:export → Data Processing
他の代表的なコマンドを見ていきます:
$ td table:list carsensor
+-----------+-------------------+------+---------+---------+---------------------------+---------------------------+
| Database | Table | Type | Count | Size | Last import | Last log timestamp |
+-----------+-------------------+------+---------+---------+---------------------------+---------------------------+
| carsensor | body_master | log | 10 | 0.0 GB | 2014-01-22 17:41:17 +0900 | 2014-01-22 17:39:11 +0900 |
| carsensor | brand_master | log | 149 | 0.0 GB | | |
| carsensor | catalog | log | 84,633 | 0.01 GB | | |
| carsensor | color_master | log | 16 | 0.0 GB | 2014-01-22 17:40:35 +0900 | 2014-01-22 17:39:11 +0900 |
| carsensor | country_master | log | 20 | 0.0 GB | 2014-01-22 17:42:57 +0900 | 2014-01-22 17:39:11 +0900 |
| carsensor | large_area_master | log | 9 | 0.0 GB | 2014-01-22 17:44:24 +0900 | 2014-01-22 17:39:11 +0900 |
| carsensor | pref_master | log | 47 | 0.0 GB | 2014-01-22 17:47:16 +0900 | 2014-01-22 17:39:11 +0900 |
| carsensor | usedcar | log | 311,043 | 0.1 GB | | |
+-----------+-------------------+------+---------+---------+---------------------------+---------------------------+
8 rows in set
$ td table:show carsensor pref_master
Name : carsensor.pref_master
Type : log
Count : 47
Schema : (
name:string
large_area_name:string
code:string
large_area_code:string
)
table コマンドで頻繁に使用するのはそのテーブルに入っているデータの一部「眺める」tail コマンドです。
$ td table:tail carsensor usedcar -n 1 -P
{
"publication_date": 1390356579,
"time": 1390356579,
"shop_datum": "world",
"recycle": "リ済別",
"engine": "ガソリン",
"warranty": "保証付",
"code": "NI",
"maintenance": "法定整備付",
"body_code": "D",
"name": "日産",
"warranty_length_kikan": "1年",
"warranty_distance": "無制限",
"body_name": "ハッチバック",
"shop_pref_code": 13,
"year": 2004,
"warranty_length": "保証期間:1年",
"inspection": "車検整備付",
"shop_pref_name": "東京都",
"odd_km": 27000,
"odd": "2.7万km",
"price": 299000,
"color": "ビーンズ",
"model": "マーチ",
"shop_lat": "35.684586",
"shop_lng": "139.303458",
"id": "CU2261202498",
"grade": "1.2 12c Vセレクション",
"url_mobile": "http://mob.carsensor.net/c/ld.cgi?EK=59&BK=CU2261202498&vos=csr145",
"url_pc": "http://www.carsensor.net/usedcar/detail.php?STID=CS210840&BKKN=CU2261202498&vos=ncsrapis00001",
"url_qr": "http://webservice.recruit.co.jp/common/qr?url=http%3A%2F%2Fmob.carsensor.net%2Fc%2Fld.cgi%3FEK%3D59%26BK%3DCU2261202498%26vos%3Dcsr146",
"main_photo_s": "http://www.carsensor.net/CSphoto/bkkn/220/195/UD0011220195/UD0011220195_001S.JPG",
"main_photo_l": "http://www.carsensor.net/CSphoto/bkkn/220/195/UD0011220195/UD0011220195_001L.JPG",
"shop_name": "日産プリンス西東京販売 レッドステーション八王子楢原店",
"maintenance_comment": "車検整備一式 エンジンオイル&オイルフィルター交換・ワイパーゴム交換",
"warranty_comment": "ワイド保証 保証期間:1年(走行距離無制限)",
"main_caption": "◆◇ご覧頂き有難う御座います。お車の『内容・状態・お支払・ご納車までの流れ』のご質問&不明点等、御座いましたら◆◇お問合せ先 042-625-2800◇◆にお気軽にご連絡下さい。◇◆",
"desc": "人気のコンパクトハッチ かわいいカラーのビーンズです走行距離が魅力なお買い得なお車です"
}
注:-P は pretty print. -n は取得数です。このコマンドで見れるデータは(timeカラムの情報で)直近のデータを tailing してくるので,データのインポートが直近でない場合は何も返ってこない場合が有ります。その場合は --to または --from でスタートおよびエンドのタイムスタンプまたは"yyyy-mm-dd hh:mm:ss"形式を指定して下さい。
一般には直前の時間情報を取れないほうがほとんどですので,
- table:import したテーブルは $td table:list で last log timestamp 項を確認する。
- bulk_import の場合は
$td query -w -d carsensor "SELECT time FROM usedcar LIMIT 10"
を実行する。
最後に,tail コマンドはシェルスクリプトを使用してクエリを叩くことなく簡易集計が可能です。例えば先頭1万件の usedcar テーブルの price 平均を取る場合,
$ td table:tail carsensor usedcar -n 100000 -P | grep "price" | cut -d: -f2 | cut -d, -f1 | awk '{x+=$1;n+=1;}END{print x/n}'
を実行します。他にも色々試して下さい。
今回はライトな内容でしたね。終わり。
実データで覚える Treasure Client コマンドラインリファンス 〜1.Data Import〜
本シリーズではTreasure Client ツールのコマンドラインリファレンスを以下の5つのレイヤーに分解し,各々について解説していくものとします。
No. | レイヤー | コマンド |
---|---|---|
1. | Data Import |
one-time import bulk import |
2. | Data Management |
db table |
3. | Data Processing |
schema query job |
4. | Data Scheduling |
sched result |
5. | Other |
help status server sample |
本日は 1. Data Import を紹介します。本シリーズでは実際にデータを使用して,その分析の流れに沿いながらコマンドラインを紹介していきます。
Treasure Platform の登録および Client Tool のインストール
それでは早速サインアップを始めましょう!こちらをクリックして下図のページより登録お願いします。
続いてクライアントツールをダウンロードします。
Source Data
リクルート様が公開してくれているカーセンサーの中古車相場データを使います。(データを提供して頂いたリクルート様,ありがとうございます!)
- APIリファレンス: http://webservice.recruit.co.jp/carsensor/reference.html
- TD用加工済データ(157MB): https://s3.amazonaws.com/doryokujin_blog/Car+Sensor.zip
One-Time Import
-- one-time import --
$ td table:import ↵usage:$ td table:import <db> <table> <files...>example:$ td table:import example_db table1 --apache access.log$ td table:import example_db table1 --json -t time - < test.jsonoptions:--format FORMAT file format (default: apache)--apache same as --format apache; apache common log format--syslog same as --format syslog; syslog--msgpack same as --format msgpack; msgpack stream format--json same as --format json; LF-separated json format-t, --time-key COL_NAME time key name for json and msgpack format (e.g. 'created_at')
1. table:import <db> <table> <files...>
$ td table:create carsensor body_master
$ td table:create carsensor color_master
$ td table:create carsensor country_master
$ td table:create carsensor large_area_master
$ td table:create carsensor pref_master
$ td table:import carsensor body_master --format json --time-key time body_master.json $ td table:import carsensor color_master --format json --time-key time color_master.json
$ td table:import carsensor country_master --format json --time-key time country_master.json
$ td table:import carsensor large_area_master --format json --time-key time large_area_master.json
$ td table:import carsensor pref_master --format json --time-key time pref_master.json
table:import コマンドは手軽にファイルを Treasure Cloud Storage へインポートできるコマンドです。状況に応じて bulk_import と使い分けてください。
- 対応ファイルフォーマット: apache, syslog, json, msgpack, msgpack.gz
※ 最適なフォーマットは msgpack.gz です。ファイルサイズが小さいという意味で。apache, syslog 形式は特殊な使い方になります。なお,csv, tsv には対応していません。
※ csv, tsv フォーマットを手軽に msgpack.gz に変換したい場合は import:prepare コマンドを利用してください。
※ なお,オプションとして -t (--time-key) が必須です。これは任意のレコードに必ず UNIX_TIMESTAMP を持ったカラムが必要である事を意味しています。TD Storage ではこの time カラムの情報よりレコードを日付&&時間ごとにパーティションを行って管理しています。
[追記] オプションを付けると任意の型のTIMEフォーマットに対応しました。
2. まとめ
これで one-time import は手軽ですが,以下の点に注意が必要です。
- 実行途中でに失敗した場合には途中からのリトライが不可能。再度同じコマンドを利用するとレコードの重複が生じる。
- 最適な形式は圧縮された msgpack.gz 形式。msgpack ファイルがある場合は gzip コマンドによって事前圧縮しておく。
- json -> msgpack.gz も変換が用意なのでできるだけ事前変換しておく。
- msgpack ファイルの内容確認は,Rubyワンライナーで可能:
$ ruby -rmsgpack -e "File.open('input.msgpack') {|f| MessagePack::Unpacker.new(f).each {|r| p r } }"
Bulk Import
始めに Bulk Import の基本概念を紹介します。
- Prepare: 元データをアップロードに最適なファイルサイズに圧縮します。この操作はローカルで行われ,出力形式は gzipped MessagePack format です。
- Upload: 圧縮されたデータは Treasure Data’s (row-based) bulk upload storage system に並列アップロードされます。このアップロードはセキュアなインターネットコネクションを用いています。
- Perform: アップロードされたデータは Treasure Data の列指向データベース(Treasure Cloud Storage)に MapReduce を用いて保存されます。
- Commit: Perform ステップの後,データは Plazma (Treasure Data’s columnar, distributed storage system) 互換の形式に変換されています。最後に Commit コマンドによって Plazma データベースにコピーされます。
-- bulk import --$ td importimport:list # List bulk import sessionsimport:show <name> # Show list of uploaded partsimport:create <name> <db> <table> # Create a new bulk import session to the the tableimport:java_version # Show versionimport:prepare <files...> # Convert files into part file formatimport:upload <name> <files...> # Upload or re-upload files into a bulk import sessionimport:auto <name> <files...> # Upload files and automatically perform and commitimport:perform <name> # Start to validate and convert uploaded filesimport:error_records <name> # Show records which did not pass validationsimport:commit <name> # Start to commit a performed bulk import sessionimport:delete <name> # Delete a bulk import sessionimport:freeze <name> # Reject succeeding uploadings to a bulk import sessionimport:unfreeze <name> # Unfreeze a frozen bulk import session
1. import:create <name> <db> <table>
bulk_import を行うための「セッション」を作成します。$ td table:create とは異なり,「テーブル」を作成するのではありませんので混同しないようにしてください。
なお,bulk_import でインポートするための<db>,<table>は既に作成されている必要があります。テーブルに既にレコードが入っている場合は bulk_import によって append されます。
$ td db:create carsensor
# for catalog_measure table
$ td table:create carsensor catalog
$ td import:create session_catalog carsensor catalog
# for usedcar_measure table$ td table:create carsensor usedcar
$ td import:create session_usedcar carsensor usedcar
# for brand_master table
$ td table:create carsensor brand_master
$ td import:create session_brand_master carsensor brand_master
上段の例では catalog_measure.csv ファイルに関して,セッションを "session_catalog" 名で作成し,Import 先となる db名: "carsensor" と table名: "catalog" を指定しています。(以後は catalog_measure.csv ファイルの Bulk Import のみを進めて行きます。中段の usedcar_measure.csv,下段の brand_master ファイルも同様の処理になります。)
2. import:prepare <files...>
このコマンドは bulk_import でデータをアップロードする前の前処理です。このコマンドによってインプットファイルサイズを bulk_import に最適なフォーマット( msgpack.gz )および最適なファイルサイズ( 約17MB )に分割されます。分割された msgpack.gz ファイルは -o オプションに指定されたディレクトリに保存されていきます。
- 対応インプットフォーマット: csv, tsv, json, msgpack, msgpack.gz
今回は csv ファイルを扱います。
[追記] まずはディレクトリ内に "parts"ディレクトリを作成しておいて下さい。prepare で分割されたファイルはここに入ります。また,元々あった "parts_result" は既に prepare を実行したファイルが入っていますので,このステップを飛ばしたい人は "parts" に名前を変更して次にお進み下さい。
# for catalog_measure table
$ td import:prepare catalog_measure.csv --format csv --column-header --time-column 'publication_date' -o ./parts/
Prepare status:
Source : catalog_measure.csv
Status : SUCCESS
Read lines : 84635
Valid rows : 84633
Invalid rows : 1
Converted Files : ./parts/catalog_measure_csv_0.msgpack.gz (1505281 bytes
Next steps:
=> execute following 'td import:upload' command. if the bulk import session is not created yet, please create it with 'td import:create <session> <database> <table>' command.
$ td import:upload <session> './parts/catalog_measure_csv_0.msgpack.gz'
# for usedcar_measure table => parts_result フォルダに usedcar_measure_n.msgpack.gz のアウトプットを置いてある。
# for catalog_measure table
$ td import:prepare brand_master.csv --format csv --column-header --time-column 'time' -o ./parts/
※ --columns には "column1, colmun2,..." とヘッダーカラム名を羅列します。もしcsvの一行目がヘッダーになっている場合は, --columns の代わりに --column-header オプションを指定してやります。
※ --time-column には UNIX TIMESTAMP となっているカラム名を指定します。TD Storage へのインポートの際,全てのレコードには unix timestamp を持ったカラムが必須となります。なぜならこの unix timestamp を日付かる各時間毎にパーティションを行っているからです。今回のケースでは擬似的に「掲載日」:publication_date を追加し,それを指定しています。
3. td import:upload <name> <files...>
次に分割圧縮したパーツファイルを Treasure Cloud Strage へ並列アップロードします。
$ td import:upload session_catalog './parts/catalog_measure_csv_0.msgpack.gz'
上記のコマンド中にコマンドが強制終了,およびネットワークが切断されて中断された場合にも,再度同じコマンドを実行し直すことでデータの重複無くアップロードを再開してくれます。これが table:import には無い大きなメリットとなっています。
なお,一般的にアップロードファイルは複数有ります。これらを並列に upload することも可能になっています。(デフォルトの並列数は「2」となっています)以下の例では 8並列でアップロードを行ってくれます。
す。
$ td import:upload --parallel 8 <name> ./parts/*
また,連続して他の分割ファイルもその後追加アップロードしていくことが可能です。
$ td import:upload <name> ./parts1/*
$ td import:upload <name> ./parts2/*
$ td import:upload <name> ./parts3/*
アップロードされたファイルを確認するには,
$ td import:show <name>
を実行します。
4. td import:perform <name>
1. $ td import:freeze session_catalog
2. $ td import:perform session_catalog
Job 7216190 is queued.
$ td job:show -w 7216190
JobID : 7216190
Status : success
Type : bulk_import_perform
Priority : NORMAL
Retry limit : 0
Result :
Database : carsensor
Query :
3. $ td import:list
+--------------------+-----------------------+---------------+----------+----------+
| Name | Table | Status | Frozen | JobID |
+--------------------+-----------------------+---------------+----------+----------+
| session_catalog | carsensor.catalog | Ready | Frozen | 7216190 |
+--------------------+-----------------------+---------------+----------+----------+
4. $ td import:error_records session_catalog
(No Output)
- まず freeze コマンドでセッションに「蓋」をします(追加アップロードできないようにします,ただし unfreeze コマンドで追加可能に戻せます)。
- 日付&&時間をキーにレコードを MapReduce します。MapReduce が実行されますのでレコード数に応じてそれなりに時間がかかります。-w は wait オプションで実行完了まで経過を表示しつづけるオプションです。
- perform 完了後の list コマンドの表示結果では,perform の実行結果が表示され,Status:Ready となっています。テーブルへのインポート完了まで後一歩です。
- なお,ここで ErrorRecords(perform 中に問題のあったレコード)に関する情報を確認しておく必要があります。
5. td import:commit <name>
$ td import:commit <name>
Bulk import session 'session_catalog' started to commit.
commit コマンドによって実際のテーブルへとインポートが行われ,一連の import 処理が完了になります。なお,このコマンドで指定する<name>は「セッション」名であり,書き込まれる「テーブル」は 1. の import:create <name> <db> <table> で指定したテーブルになることに注意してください。
6. まとめ
$ td import:list
+--------------------+-----------------------+---------------+----------+----------+
| Name | Table | Status | Frozen | JobID |
+--------------------+-----------------------+---------------+----------+----------+
| session_catalog | carsensor.catalog | Committed | Frozen | 7216190 |
+--------------------+-----------------------+---------------+----------+----------+
$ td table:tail carsensor catalog -P
{
"publication_date": 1390356579,
"time": 1390356579,
"person": 7,
"body_code": "M",
"code": "TO",
"body_name": "ミニバン",
"width": 1650,
"name": "トヨタ",
"height": 1935,
"length": 4070,
"price": 2285000,
"period": "198808-198908",
"desc": "※このクルマの燃費は発売当時の資料により、10モードの数値を表示しております。燃費=9.2km/l",
"model": "ライトエース",
"series": "E-YM40G",
"grade": "2.0 FXV 4WD"
}...
これで bulk_import は完了です。多少ステップ数はあるものの,以下の点で table:import コマンドより優れています:
- upload コマンドによって自動的にインポート対象ファイルを元ファイルより小さな msgpack.gz という圧縮形式に変換してくれ,ネットワーク負担を下げてくれる。
- アップロードが途中で失敗しても重複することなく途中からリトライできる。
- 並列アップロードが可能。
- 作成したセッションを残しておけば,同じファイルを別名のテーブルへ再アップロードなしに commit,つまりテーブル再インポートが可能。
ただし,以下の点に注意してください:
- prepare コマンドはシングルスレッドなので遅い。[修正] オプションによって並列処理が可能です。(デフォルトは並列数2です。) 複数ファイルを対象にする場合は, $ ls <files*> | parallel td import:prepare {} などで並列実行する。
- [追加] prepare コマンドと upload コマンドを同時に事項できるコマンドが import:upload コマンドです。これによると新しい分割ファイルが作成されると同時にそのファイルをアップロードしてくれます。
- インポート対象ファイルに前処理(不要レコード削除・カラム追加・集計カラム追加)を行う場合は自前で前処理コマンド → msgpack.gz への変換スクリプトを作成する必要がある。