駅データの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