Logicky Blog

Logickyの開発ブログです

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