OSSなDWH InfiniDB の話 ③ ~データのロード
前回の投稿で、郵便番号テーブル(zip) を作成しました、今後はこのテーブルの中に、 郵便番号データをロードする方法を説明します。まあ、普通にやれば、mysql 同様、LOADでやれば良いのですが、InfiniDBならではのロード方法、バルクローダーについてここでは説明いたします。
バルクロードを行うステップとしては、
- 定義ファイルを作成する
- 作成した定義ファイルを元にロードする
という二段階の作業が必要です。正直なんでこんなめんどくさい作業をしているのか、よくわかりませんが ETLなどを利用した時に、あらかじめ定義ファイルを作っておけば、定義ファイルを修正するだけで、ロードしやすくする設置なのではないかと解釈しております。
以下、作業手順になります
ジョブファイルを生成する ファイルをロードするための定義ファイルをxml形式で、生成するためのユティリティです。オプションについてのヘルプは以下の通りです
/usr/local/Calpont/bin/colxml -h
Running colxml with the following parameters: Usage: colxml [options] schema Options: -d delimiter -e max error rows (numeric) -h Print this message -j Job id (numeric) -l load file name -n "name in quotes" -p path for XML job description file that is generated -s "description in quotes" -t table name -u user -r Number of read buffers (numeric) -c Read buffer size (numeric) -w Write buffer size (numeric)) -x Extention of file name -b debug level (1-3)
schema Required field, all others are optional! Example: colxml -t lineitem -j 123 schema
今回は、/home/squad/app/sql にJob_01.xmlというxml定義ファイルを出力し、ken_all.csv というcsvファイルをロードします。
上記ヘルプを踏まえ以下のようなコマンドを実行しました。
/usr/local/Calpont/bin/colxml mydbidb -d , -t zip -j01 -p /home/squad/app/sql -l "ken_all.csv" -s "/home/squad/app/sql"
上記オプションについて補足いたします
-d 文字列のデリミタを指定します。ここでは、カンマ(,)を指定しております -t テーブル名を指定します。ここでは、zipを指定しております。 -j JobIDを指定しております。ここでは、01を指定しております。(-job と番号の間を空けないでください) -p xmlが出力されるパスを指定します。ここでは、/home/squad/app/sqlを指定しております。 -l ロードするファイル名を指定しております。ここでは、ken_all.csv を指定しております -s ロードするファイルが格納されているパスを指定します。ここでは、"/home/squad/app/sql"を指定しております。
実行証跡
/usr/local/Calpont/bin/colxml mydbidb -d , -n "\"" -t zip -j01 -p /home/squad/app/sql -l "ken_all.csv" -s "/home/squad/app/sql"
Running colxml with the following parameters: 2010-11-19 12:29:49 (10787) INFO : Schema: mydbidb Tables: zip Load Files: ken_all.csv ken_all.csv -b 0 -c 1048576 -d , -e 10 -f CSV -j 01 -n -p /home/squad/app/sql -r 5 -s /home/squad/app/sql -u -w 10485760 -x tbl
Creating job description file: /home/squad/app/sql/Job_01.xml File completed for tables: mydbidb.zip
Normal exit.
上記にて出力された、xmlをベースに郵便データをロードします
/usr/local/Calpont/bin/cpimport -h
Usage: cpimport -j jobID [-h][-r readers][-w parsers][-s c][-f path][-d debugLevel][-i] Options: -d Print different level (1-3) debug message -i Print extended info to console, else extended info only goes to log file -h Print this message -j Job id (Required) -n NullOption (0-treat the string NULL as data (default); 1-treat the string NULL as a NULL value) -p path for XML job description file -r number of readers -w number of parsers -s 'c' is the delimiter between values -f data file(s) directory path; specify 'STDIN' to redirect input from stdin (STDIN must be all caps) -j option is required! Examples: cpimport -j 1234
/usr/local/Calpont/bin/cpimport -p /home/squad/app/sql -j01 -f /home/squad/app/sql
以下オプションについて補足いたします
-p /home/squad/app/sql/Job_01.xmlのパスを指定しております。 -j JobIDを指定しております。ここでは、01を指定しております。(-job と番号の間を空けないでください) -f csvファイルが格納されているパスを指定しております。ここでは、/home/squad/app/sql
実行証跡
/usr/local/Calpont/bin/cpimport -p /home/squad/app/sql -j01 -f /home/squad/app/sql
Bulkload root directory : /usr/local/Calpont/data/bulk job description file : /home/squad/app/sql/Job_01.xml 2010-11-19 13:46:10 (11754) INFO : successfully load job file /home/squad/app/sql/Job_01.xml 2010-11-19 13:46:10 (11754) INFO : PreProcessing check starts 2010-11-19 13:46:11 (11754) INFO : PreProcessing check completed 2010-11-19 13:46:11 (11754) INFO : preProcess completed, total run time : 1 seconds 2010-11-19 13:46:11 (11754) INFO : No of Read Threads Spawned = 1 2010-11-19 13:46:12 (11754) INFO : No of Parse Threads Spawned = 3 2010-11-19 13:46:13 (11754) INFO : For table mydbidb.zip: 122964 rows processed and 122964 rows inserted. 2010-11-19 13:46:14 (11754) INFO : Bulk load completed, total run time : 4 seconds
以上でデータがロードできました。
。。が。。実は大きな問題があります。 それは、文字と文字をくくる、ダブルクォーテーションに対応していないようなのです、いろいろなサイトを 探しましたが、抜本的な解決案がでておりませんでした。(アメリカの人って、そういう文化はあまりないのかな?) そのような場合は、今のところMySQLローダーを使ってください。もしくは、csvファイルから、"を抜いてください・
将来的には、改善する可能性も高いので、直ったらどなたか教えてください。