べにやまぶろぐ

技術寄りの話を書くつもり

Google スプレッドシートを BigQuery のテーブルとして扱う

とても便利な機能だと思うのですが、あまり日本語の記事を見かけない気がするので書き記しておきます。

Google スプレッドシートは BigQuery 上でテーブルとして参照できる

普段仕事で BigQuery を使っているのですが、データソースは必ずしも BigQuery 上にあるわけではありません。特に、誰でも自在に変更のできる Google スプレッドシートをマスターにして回っている業務が結構多いです。

この時、Google スプレッドシートのデータをいちいちインポートせずとも BigQuery 上のテーブルとしてアクセスできる方法があります。

f:id:beniyama:20190217231347p:plain

外部テーブルの参照先に Google スプレッドシートを指定する

まず、Google スプレッドシートを参照する外部テーブルを BigQuery 上に作成する必要があります。

通常のテーブル作成画面を開いた後、下図のようにテーブルの作成元は『ドライブ』、ファイル作成元に『Google スプレッドシート』を指定します。

f:id:beniyama:20190217233523p:plain

続いて『ドライブの URI を選択』ですが、ツールチップに書いてあるように

https://docs.google.com/spreadsheets/d/[file_id](Google スプレッドシートの場合)

を指定します。 [file_id] は Google スプレッドシートの URL に表出していますが、ファイルを右クリックして 『共有可能なリンクを取得』からでも確認可能です。

『送信先』にはプロジェクト名、データセット名、そして今回作成する外部テーブル名を指定します。

外部テーブルのスキーマを Google スプレッドシートに合わせる

続いて、外部テーブルのスキーマを設定します。自動検出も可能ですが、きっちり型を指定しておいた方が安心でしょう。

例えば次のような Google スプレッドシートがあるとします。

f:id:beniyama:20190217232217p:plain

このカラム順のまま、BigQuery 上のフィールド名や型などを指定します。

f:id:beniyama:20190217235736p:plain

これで設定は完了です。

f:id:beniyama:20190218000153p:plain

このように通常のテーブルとしてクエリを投げることができますし、Google スプレッドシート上の変更もクエリの結果に自動的に反映されます。

注意点

BigQuery へのインポートやデータ操作などしなくても Google スプレッドシートの UI からデータ更新ができる魅力的な機能ですが、いくつか注意点がありそうです。

1. 参照できるのはファイル内の最初のタブだけ

複数のシートから構成されるファイルの場合、BigQuery のテーブルとして参照できるのは最初のタブだけのようです。

つまり、BigQuery から参照したいデータが複数種類ある場合は1ファイルにまとめることはできず、データごとに別々のファイルを作成して個々に連携設定を行う必要があります。

2. スキーマの変更はフィールドの追加だけ

Google スプレッドシートの方のカラムの順序を変更したとき、外部テーブルは一回破棄して作り直さないといけなさそうです。

BigQuery の GUI コンソールからできたのはフィールドの追加だけで、すでに定義したフィールドの削除や順序変更を行うことはできなさそうでした(CLI コンソールなどでできるかは未確認です)。

3. Google スプレッドシートのヘッダは無視される

例にあったように1行目に日本語で『誕生日』などのヘッダを記載しても無視されます。

また、ヘッダ行が無くても1行目は正しくデータとして認識されました。2行以上、スキーマに合わない行があるとエラーになるということかなと思います。

いずれにせよ Google スプレッドシート側のフォーマット自体が変更されるとスキーマの不一致が起きますので、その辺は注意する必要があります。

まとめ

今回ご紹介した機能は公式ドキュメントでは『Google ドライブデータにクエリを実行する』として記載されていますので、詳しくはそちらをご覧ください。

cloud.google.com

こちらは英語版ですがアクセス権の管理など含めもう少し詳細に書いてあります。

cloud.google.com

元々は仕事で使っている Looker で Google スプレッドシートにアクセスするときどうすれば良いか?を Looker 社の方に問い合わせて教えていただいたのですが、こういった BI 環境構築に限らず、Google スプレッドシートと BigQuery 双方を使っている環境では汎用的に役立つ機能かと思います。