
ポチコのデータ分析
こんにちは @petitviolet です。
いまどき「データ分析」というと、データアナリストがいてデータエンジニアがいてごりごりに分析を回してます!みたいな想像をされるかもしれませんが、弊社のポチコを開発・運営しているチームは小さく、データ分析に割くリソースも決して多くはありません。
なので、今は必要に応じて出来ることを少しずつ増やしていこうという方向でデータ分析出来る体制を整えていっている状況です。
全体像
BigQueryにデータをいれてLooker Studioで可視化する、というのがメインコンセプトです。
データソースは2系統あり、Cloud FirestoreとStripeです。

ポチコではDBとしてCloud Firestoreを採用しており、これをBigQueryにどうやって入れるかが課題になりそうなところではありましたが、FirebaseのExtensionとしてStream Firestore to BigQueryが提供されており、Firestoreのドキュメント形式のデータをBigQueryにexportしてくれるものとなっています。
exportするデータの対象としてコレクション(サブコレクション)を指定する必要があるため、コレクションの種類が増えたときにはそのたびにextensionをインストールする必要がありますが、それ以外に特に手間はかからずお任せで運用できるのがメリットです。(裏側で複数のCloud Run Functionsがデプロイされますが、触る必要はないはずです。)
第二のデータソースとしてはStripeになっており、決済関連のデータはこちらに保存されています。Cloud Run JobsとCloud Schedulerを組み合わせて定期的にStripeのAPIを叩いてデータを取得し、BigQueryに保存しています。
データの整形
いわゆるETL/ELTのEとLは前述の通りシンプルな形で実装されていますが、Tについては少し工夫が必要です。
まず、Stream Firestore to BigQueryは↓の2種類のリソースを設定単位(つまりコレクション)ごとに生成します
xxx_raw_changelog テーブル
xxx_raw_latest ビュー
Firestoreから実際にエクスポートされるものはxxx_raw_changelogに入っていて、そこから最新のデータを取得するためのビューとしてxxx_raw_latestが提供される、という形式になっています。
そして当然ながらextension経由でBigQueryに入ってくるFirestoreのデータは、元がドキュメントであるためJSONでそのまま格納されています。
これをBigQueryが提供する JSON周りの関数 を使ってパースして必要な形に整形する必要があります。

余談ですが、整形するためのクエリをしばらくはビューとして実装していましたが、データソースとなるxxx_raw_latest自体がビューになっているため、パフォーマンスがクエリがやや重たかったのが問題でしたが、最近Materialized Viewに置き換えて改善しました。アプリケーション側ではFirestoreというかドキュメント型DBが持つ柔軟性を使ってJSON型なフィールドを追加することが多いのでBigQuery側でも頻繁に定義が変わるのを反映させるため、Materialized Viewを作るためのクエリをSaved Queryとして保存しておいて必要に応じてSaved Queryを編集してRunすればMaterialized Viewが更新されていい感じです。
Materialized Viewを作成する際にはオプションで `allow_non_incremental_definition`を指定することで多少複雑なクエリを利用することが出来るようになるので可能な状況であればおすすめします。
単に正規化されたテーブル/Materialized Viewがあるだけだと可視化の観点では不便なことも多いため、Stripeのデータとjoinしておいたり統計情報を追加したMaterialized View(or ただのView)を作成してみたいデータを用意するようにしてあります。
可視化について
前述の通り、可視化にはLooker Studioを利用しています。これが無料で使えるなんてありがたい時代です。
事前にたくさん作ったViewやMaterialized Viewをデータソースとして登録しておき、テーブルやグラフとしていい感じに表示するだけとなっています。

Looker Studioには複数のデータを統合するblendという機能もありますが、見通しも悪くなるしメンテし辛い印象があるので使わないように、全てBigQuery側で実装するようにしています。
まとめ
Firestoreを使っているからとデータ分析を諦めず、とにかくBigQueryに入れてしまえば後は何とでもなるという精神でやっているというお話でした。