なんでBigtableのバックアップ/リストアツールって用意されて 無いんだろと思ってたら Python版 のみ用意されてたのね orz.

仕方が無いので Java版を自力で作る方向を考えてみる。

まずデータ形式はJSONとする。 Python版は XML or CSV のようだがJSONの方が軽いので。

CSVは簡易形式としては便利だけどBigtableを完全に表現できないので 直接は扱わない。 CSV->JSONのフィルタを別ツールで用意すれば良い。

データの仕様を決めてみる。

基本仕様

  • 1つの Entity は 1つのJSONオブジェクト({〜})として表す。
  • Entity のプロパティ名がそのままJSONのプロパティ名となる。
  • プロパティ名 "__key__" は Entity の Key として元々予約である。
  • プロパティ名の文字列化は省略可能。JavaScript互換仕様。
  • プリミティブ以外のデータはプロパティ type を必須とするJSONオブジェクトで表す。

イメージ:

{__key__:{type:"Key", id:1234}, data1:123, data2:{type:"Date",value:1234567890},...}

各データ種別毎の仕様
クラスJSON表現説明
nullnull
Long123
Double123.0'.' or 'e' を含める事でLongと区別する。
Booleantruetrue or false
String"文字列"日本語はUTF8 or \uXXXX。改行は \n にエスケープ。
Key{type:"Key", name:"key名"}文字列Keyの場合
{type:"Key", id:keyID}LongKeyの場合
{type:"Key", name:"key名" or id:keyID, parent:{再帰的にKey}}親を持つ場合
Date{type:"Date", value:経過ミリ秒}valueはgetTime()の値
{type:"Date", fmt:"書式", value:"日時"}SimpleDateFormat形式で表現
ShortBlob{type:"SBlob", value:"16進文字列"}
Blob{type:"Blob", value:"16進文字列"}
Text{type:"Text", value:"文字列"}Stringに同じ
User{type:"User", email:"メールアドレス", authDomain:"ドメイン名"}
Link{type:"Link", value:"URL文字列"}
Collection[data1,data2,...]配列で表現

てな感じかな。
クライアントは CUI でやるしか無いね。 30秒ルールが有るから分割して Upload/Download するしかないだろうし。