GAEのbulk loaderツールを使って駅データのCSVをデータストアにアップロードする
駅データのcsvファイルをGAEのデータストアにアップロードしたい。
csv等をデータストアに一括アップロードする場合、bulk loaderツールを使う。bulk loaderはappcfg.pyコマンドから使用できる。bulk loaderツールは、remote_apiを使用してGAEアプリのデータストアに一括アップロードする。
remote_apiが設定されていない場合は、まず最初に設定する必要がある。 http://bit.ly/9YoNpV に2種類の設定方法が書いてある。
remote_apiの設定が終わったら、次にbulk loaderの設定をする必要がある。bulk loaderの設定をするには、まずbulkloader.yamlを自動生成する。
appcfg.py create_bulkloader_config --filename=bulkloader.yaml {directory}※{directory}はアップロードしたいアプリのディレクトリ名を入れる。
これによって、bulkloader.yamlが自動生成されるので、生成されたファイルを開き、編集する。
但し編集の前に、データの仕様を決めておく必要がある。僕はDjangoパッチを使っているので、models.pyに下記クラスを記入した。駅データのCSVを開いて、各カラム名とその要素のデータ仕様に合わせたもの。
class Station(db.Model): rr_cd = db.IntegerProperty() line_cd = db.IntegerProperty() station_cd = db.IntegerProperty() line_sort = db.IntegerProperty() station_sort = db.IntegerProperty() station_g_cd = db.IntegerProperty() r_type = db.IntegerProperty() rr_name = db.StringProperty() line_name = db.StringProperty() station_name = db.StringProperty() pref_cd = db.IntegerProperty() lon = db.FloatProperty() lat = db.FloatProperty() f_flag = db.IntegerProperty()上記データ仕様に合わせて、bulkloader.yamlを編集する。編集方法は、 http://bit.ly/9YoNpV に詳細が書いてあるが、編集結果は下記のとおり(編集したのは、transformers:以下の行)。
# Autogenerated bulkloader.yaml file.# You must edit this file before using it. TODO: Remove this line when done.# At a minimum address the items marked with TODO:# * Fill in connector and connector_options# * Review the property_map.# - Ensure the 'external_name' matches the name of your CSV column,# XML tag, etc.# - Check that __key__ property is what you want. Its value will become# the key name on import, and on export the value will be the Key# object. If you would like automatic key generation on import and# omitting the key on export, you can remove the entire __key__# property from the property map.
# If you have module(s) with your model classes, add them here. Also# change the kind properties to model_class.python_preamble:- import: base64- import: re- import: google.appengine.ext.bulkload.transform- import: google.appengine.ext.bulkload.bulkloader_wizard- import: google.appengine.ext.db- import: google.appengine.api.datastore- import: google.appengine.api.users
transformers:
- kind: Station connector: csv connector_options: encoding: euc-jp property_map: - property: rr_cd external_name: rr_cd import_transform: int
- property: line_cd external_name: line_cd import_transform: int
- property: station_cd external_name: station_cd import_transform: int
- property: line_sort external_name: line_sort import_transform: int
- property: station_sort external_name: station_sort import_transform: int
- property: station_g_cd external_name: station_g_cd import_transform: int
- property: r_type external_name: r_type import_transform: int
- property: rr_name external_name: rr_name
- property: line_name external_name: line_name
- property: station_name external_name: station_name
- property: pref_cd external_name: pref_cd import_transform: int
- property: lon external_name: lon import_transform: float
- property: lat external_name: lat import_transform: float
- property: f_flag external_name: f_flag import_transform: int編集したら、下記コマンドを打って、アップロードする。
appcfg.py upload_data --config_file=bulkloader.yaml --filename=m_station.csv --kind=base_station {directory}**
追記2011/02/24:—kind=Stationをbase_staitionに修正した。Djangoの場合特有かもしれないが、baseという名のapp内のmodels.pyでStationクラスを作った場合、kindは、base_stationになる。これ知らなかった。**
※{directory}はアップロードしたいアプリのディレクトリ名を入れる。
※m_station.csvは、csvファイルの名前にする。これは駅データからダウンロードしたcsvのファイル名。
これで、アップロード完了。下記のように、10745データを9分位かけてアップロードした。
[INFO ] 10745 entities (10684126 bytes) transferred in 535.9 seconds[INFO ] All entities successfully transferredちなみに、ローカルの開発サーバにアップロードするコマンドは下記。
appcfg.py upload_data --config_file=bulkloader.yaml --filename=m_station.csv --kind=base_station --url=http://localhost:8000/remote_api {directory}**
追記2011/02/24:—kind=Stationをbase_staitionに修正した。Djangoの場合特有かもしれないが、baseという名のapp内のmodels.pyでStationクラスを作った場合、kindは、base_stationになる。これ知らなかった。**
開発サーバへのアップロードの場合は、10745データを3.5分位でアップロードした。
[INFO ] 10745 entities (4096563 bytes) transferred in 211.9 seconds