GAEのBigtableへのデータのインポートとエクスポートをやってみた

どうも、うしねずみです。

Google App Engineで使えるデータベースはBigtableというのですが、このデータベースへのデータのインポートとエクスポートをやってみました。結論から言うと、日本語を含まないデータのインポートだけしかできませんでした。以下にまとめてみます。

基本的にはGoogleのスタートガイドのページのここに解説されています。だたし、気をつけなければいけないのは、データのインポートおよびエクスポートは英語版のSDKでしかできません(2009年8月3日現在)。どうやらSDKの1.2.1から加わった機能のようです。日本語のダウンロードページで公開されているのは1.2.0なので指示通りのコマンドを入れてもエラーを吐かれます。ですので英語のダウンロードページから最新版(2009年8月3日現在は1.2.3)をダウンロードしてインストールしてください。

これであとは解説ページ通りに行えば行けます。まだローカル環境でしか試してないのですが、1087件のレコードをインポートすることに成功しました。ただしこれは日本語を含まない場合のみで、日本語を含むデータでは

[ERROR   ] Error in worker [Thread-6]: ‘ascii’ codec can’t decode byte 0x82 in p
osition 0: ordinal not in range(128)

というエラーが出てアップロードできませんでした。
また、エクスポート機能についてはGAEのサイトで以下のように言及されています。

2009 年 4 月: Python SDK リリース 1.2.1 には、データのアップロード機能と類似した、データのダウンロード機能の初期バージョンが含まれています。この機能はまだ appcfg.py では使用できませんが、試したい場合は、bulkloader.py をご覧ください。マニュアルを含めたこの機能の完全版を、今後の SDK バージョンでリリース予定です。

さっそくSDKの中からbulkloader.pyというファイルを探して覗いてみました。
【注意】:google_appengineの中には同じ名前のファイルが複数個所にあって分かりにくいですが、ここで言っているのは
\google_appengine\google\appengine\tools
にあるbulkloader.pyです。

この中で定義されているExporterというクラスがLoaderに対応するクラスのようです。さらに見ていくと、appcfg.py(これも上記のbulkloader.pyと同じフォルダ)の中のPerformUploadという関数の近くに(2038行付近)PerformDownloadという関数が定義されています。アップロードには’upload_data’というコマンドが紐付いていますが、ダウンロードには’download_data’が紐づけられているようです(2267行付近)。

つまり、データのアップロードの時に作ったローダクラス(Googleの説明だとalbum_loader.pyになっている)の中のLoaderをExporter、loadersをexportersに書きえてやれば動きそう。
アップロード時のコマンドは(ローカルでテストする場合は)以下でしたが

appcfg.py upload_data --config_file=album_loader.py --filename=album_data.csv --kind=Album --url=http://localhost:8080/remote_api <app-directory>

エクスポートの方では以下のようにすれば動くはず。

appcfg.py download_data --config_file=album_loader.py --filename=exporteddata.csv --kind=Album --url=http://localhost:8080/remote_api <app-directory>

ちなみにローカルでテストするときはちゃんとGAEのローカルサーバ(dev_appserver.py)を動かしておいて下さいね。
いや、しかし動かないんだこれが。
 KeyError: ‘Album’
と言われてしまう。「Album」なんて種類のデータは無いんだと。いや、さっきアップロードしましたよっ!データベースから種類「Album」のデータの最初の100件を表示するテストページも問題なく動作してますよ!

なんでだろー。
知ってる方いましたら教えてくださいー。

結局、日本語を含まない場合のインポートだけしかできませんでした。
データのエクスポートができないままでは新規利用者にとって本格導入したい人も二の足を踏みます。もし他のプラットフォームに移行したくなっても、データが取り出せなきゃどうしようもないので。Googleさん、早く正式対応してください。それからドキュメントを…orz