Database JUNKY

MySQL,MariaDBを中心としたブログです

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ファイルから、"を抜いてください・

将来的には、改善する可能性も高いので、直ったらどなたか教えてください。