Firestoreのデータを分析するための3つの方法とその注意点

別の記事を書く前に、いろいろ試したことの備忘録。
Firestoreのデータをいろいろ見たかったけど、
別プロジェクトの移動してみることにした経緯のまとめ。

試したのは以下の3つ

  1. エクスポートデータをBigQueryにインポートしてBigQuery上で確認
  2. node-firestore-import-exportを使ってローカルのJSONファイルとしてエクスポートして確認
  3. 別プロジェクトにデータを移行して、別プロジェクト上で確認(この記事)

それぞれの方法と注意点は以下の通り。

1. BigQueryにインポートして確認

公式ドキュメントなどで紹介されている通り、
FirestoreのデータをBigQueryにインポートできるらしい。

これが一番いい方法だが、後述するカラム10000制約に引っかかったので、諦める形に。。

流れとしては、こんな感じ。

  1. バックファイルファイルを配置できるようCloud StorageにBucketを作成
  2. gcloudを使って、Firestoreのバックアップファイルを作成したBucketにエクスポート
  3. BigQueryでデータセットを作成
  4. テーブルを作成する際に、テーブル作成元に「Google Cloud Storage」を選択

注意: ハマった点

a. バックアップデータを作成する際は、collection-idsを指定しないといけない

公式ドキュメントにも書いてあるが以下の通りらしい。。

エクスポート コマンドには、collection-idsフィルタを指定する必要があります
コレクションIDフィルタを指定せずにエクスポートされたデータをBigQueryに読み込むことはできません。

なので、バックアップする際は、こんな感じで、コレクションを指定しなければならない。

$ gcloud beta firestore export gs://[BUCKET_NAME] --collection-ids=[COLLECTION_ID_1],[COLLECTION_ID_2]
b. ファイル形式も「Cloud DataStoreバックアップ」に変更しないといけない

公式ドキュメントのスクリーンショットになかったのでハマった。。

スクリーンショット_2019-09-24_19_50_01.png

インポートする際には、ファイル形式も「Cloud DataStoreバックアップ」に変更しないといけないらしい。。
なにもしていないと、ファイル形式「Avro」になっているので、ファイル形式が合わずエラーになってしまう。。

c. ドキュメントフィールドがobjectの場合、ドット区切りで展開され、カラムの上限は10000まで

これが原因で諦めました。。

Firestore上で、以下のようなobjectやマップなどが存在すると、

{
  "uid": "XXXXX",
  "group": {
    "groupA": true,
    "groupB": false
  }
}

BigQueryにインポートする際、ドットで繋げる形で展開されます。

uid, group.groupA, group.groupB

また、公式ドキュメントの制約事項に、

Cloud Firestore のエクスポートを正しく読み込むには、
エクスポートデータ内のドキュメントが一貫したスキーマを共有し、
個別のフィールド名が10,000個未満でなければなりません。

と、あるため、大量のプロパティを持つobjectをセットしていると、インポート時にエラーになります。。

対応策

フィールド数の問題を回避する方法として、特定のフィールドだけ読み込むこともできます。

CLI で --projection_fieldsフラグを使用するか、
load ジョブの構成でprojectionFieldsプロパティを設定することで
特定のフィールドを読み込むことができます。

とあるため、読み込むフィールドを指定することで、回避することができそうです。

2. node-firestore-import-exportでローカルにエクスポート

次にやったのがこれ。
node-firestore-import-exportを使うと、CUIでJSON形式でエクスポートできるらしい。
JSON形式でエクスポートできれば、ツールなど作っていろいろできそうかなと。

実行するには、Google Cloudアカウントのcredentialsファイルが必要。

# インストール
$ npm install -g node-firestore-import-export

# 全体のバックアップ
firestore-export --accountCredentials path/to/credentials/file.json --backupFile backups_myDatabase.json

# コレクションを指定して、一部だけをエクスポート
firestore-export --accountCredentials path/to/credentials/file.json --backupFile backups_myDatabase.json --nodePath collectionA

データ量が多い場合は、--max_old_space_sizeを指定して実行する。

node --max_old_space_size=8192 /usr/local/bin/firestore-export --accountCredentials path/to/credentials/file.json --backupFile backups_myDatabase.json

注意: というか見送った点。。

サクッと使えてよかったけど、データ量が多いと、やはりつらい。。

  1. データ量が多いと、メモリ不足やFirestoreとのコネクション切れで失敗する
  2. 無料枠でも使えるが、firebase-adminを使って取ってきているだけなので読み込みが大量に発生する
  3. エクスポートしたファイルも大きくなるため、ツールでもメモリを大量に使う

別プロジェクトにデータを移行して、別プロジェクト上で確認

上の2つの方法を試してなんとかしたかったのは、このの3つ。

  1. エクスポート時に大量の読み込みが発生し、本番環境の無料枠を消費する
  2. ネストが深いobjectがあるとと簡単にBigQueryにインポートできない
  3. ローカルファイルでも全データをメモリ上に展開するので、つらい

そのため、別プロジェクトに移行して、本番環境と関係ない部分で、いろいろ触れるようにしてみた。
これであれば、本番環境を気にせず、firebase-adminとかで、いろいろ調べたりできそう。

詳細なやり方は、別の記事にまとめました。

他と同様、リアルタイムの情報ではないので、注意が必要。

簡単なまとめ

1. BigQueryにインポートして確認
  • BigQuery上なので、SQLで分析ができる
  • 有料プランのみ
  • 注意: バックアップデータを作成する際は、collection-idsを指定しないといけない
  • 注意: ファイル形式も「Cloud DataStoreバックアップ」に変更しないといけない
  • 注意: ドキュメントフィールドがobjectの場合、ドット区切りで展開され、カラムの上限は10000
2. node-firestore-import-exportでローカルにエクスポート
  • 無料枠でも使える
  • JSONでエクスポートできる
  • 注意: エクスポート時に大量の読み込みが発生し、本番環境の無料枠を消費する
  • 注意: ドキュメントのネストが深いと簡単にBigQueryにインポートできない
  • 注意: ローカルファイルでも全データをメモリ上に展開するのでつらい
3. 別プロジェクトにデータを移行して、別プロジェクト上で確認(この記事)
  • 有料プランのみ
  • 別プロジェクトなので、本番環境を気にせず使える

こんなのつくってます!!

積読用の読書管理アプリ 『積読ハウマッチ』をリリースしました!
積読ハウマッチは、Nuxt.js+Firebaseで開発してます!

もしよかったら、遊んでみてくださいヽ(=´▽`=)ノ

要望・感想・アドバイスなどあれば、
公式アカウント(@MemoryLoverz)や開発者(@kira_puka)まで

参考にしたサイト

Originally published at qiita.com

きらぷか@i18n補助ツール『トランスノート』開発者

フリーエンジニア/今はNuxt.js/いつかFlutter 受託&アプリ/Webサービス/ゲームを #個人開発 CS修士→SIer/R&D→フリー #paiza はAランクで満足/AtCoderしたい 仕事依頼やご相談はDMまで Kotlin/Python/Swift/Unity/Java/Haskell/DDD

Crieitは個人で開発中です。 興味がある方は是非記事の投稿をお願いします! どんな軽い内容でも嬉しいです。
なぜCrieitを作ろうと思ったか

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください!

ボードとは?

関連記事

コメント