INFRA

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