dbt × BigQuery でスプレッドシートを source としてコード管理する

この記事は dbt Advent Calendar 2024 の15日目の記事です。

Data Management チームの森岡です。

スプレッドシート便利ですよね。スプレッドシートをデータソースとして、BigQuery に取り込んでいるケースも多いと思います。ただ、スプレッドシートを外部テーブルとして BigQuery に取り組むとき、Google Cloud のコンソールで操作するの面倒じゃないですか。

シートの範囲を間違えたり、カラム名がイマイチで作り直したら、今度は「あれ?ヘッダー行のスキップ指定、忘れてた...」となってやり直しになること、ありますよね?

今回は、そういった煩わしさを解決するために、スプレッドシートを dbt の source としてコード管理する方法について紹介します。

スプレッドシートをsourceとしてコード管理する方法

結論から言えば、dbt_external_tables を使いましょうということです。

手順はめっちゃ簡単です。

1. dbt_external_tables を install

packages.yml に dbt_external_tables を追加して、 dbt deps を実行します。

packages:
  - package: dbt-labs/dbt_external_tables
    version: 0.10.0

2. sourceの定義を記述する

適当な dbt の source に exernal という プロパティを追加し、外部テーブルとして取り込みたい スプレッドシートの定義を記述します。 下記に例を示します。

version: 2

sources:
  - name: hoge
    tables:
      - name: fuga
        external:
          location: https://docs.google.com/spreadsheets/d/fuga # スプレッドシートのURL
          options:
            format: google_sheets
            sheet_range: "fuga_sheet!A:C" # シート名と範囲
            # ここより下はオプション。利用可能なオプションはBigQueryのドキュメントを参照してください。
            # https://cloud.google.com/bigquery/docs/reference/standard-sql/data-definition-language#external_table_option_list
            max_bad_records: 0
            skip_leading_rows: 1
        columns: # カラム定義
          - name: foo
            description: "foo"
            data_type: STRING
          - name: bar
            description: "bar"
            data_type: NUMERIC

3. macroを実行し、外部テーブルを作成する

以下のコマンドを実行すると、外部テーブルが作成されます。

$ dbt run-operation stage_external_sources --args "select: {DBT_MODEL_NAME}"

ちなみに、このmacroには外部テーブルを置き換えはせず、メタデータのみを更新する①create if missing, refresh metadataと置き換えを行う②create or replaceの2つのモードがり、デフォルトだと①のモードで実行されます。②のモードで実行したい場合は、以下のような引数を渡します。

$ dbt run-operation stage_external_sources --args "select: {DBT_MODEL_NAME}" --vars "ext_full_refresh: true"

以上です。

これで、dbt で スプレッドシートをsourceとしてコード管理できるだけでなく、ちょっと変更したいときはコマンド一発で再構築ができるようになります。便利ですね。

おまけ

実は、dbt-external-tables というパッケージの存在は数年前から知っていたのですが、スプレッドシートにも利用できると知ったのは最近です。というのも、dbt-external-tablesの GitHub のページのどこにもスプレッドシートについて書いていないんですよね。

ページ内を spreadsheet で検索すると、以下のような issue もでてくるので、サポートしていないのだと思っていました。 Support for BigQuery external tables on Google Sheets using python · Issue #212 · dbt-labs/dbt-external-tables · GitHub

最近になって、ないなら作るかーと思い立ち、 dbt-external-tablesを参考にしようとコードを読んでいたら、「あれ?これできるじゃん…」となった次第です。ちゃんとコード読むって大事ですね。

まとめ

今回の記事では、データの入口として利用されるスプレッドシートを、dbt sourceとしてコード管理する方法をご紹介しました。

スプレッドシートは便利なツールですが、適切に管理しなければ、(データエンジニアにとっての)地獄を生み出す要因になりかねません。データ基盤の透明性を高め、依存関係を俯瞰的に把握するためにも、コード管理は非常に有効な手法です。本記事がみなさまの参考になれば幸いです!

ちなみに、データの出口として利用されるスプレッドシートをdbt exposureとして管理する方法については、以下の記事で詳しく紹介されています。我々のチームでも非常に参考にさせていただいております。この場をお借りして、感謝申し上げます。

dbtのモデルとConnected Sheetsの依存関係をexposureで表現して、データ管理を効率的に行なおう - yasuhisa's blog


最後に宣伝です。

CADDi でもアドベントカレンダーを実施しているのですが、その中で4日目の記事も担当させていただきました。

手前味噌ではありますが、こちらも実用的な内容になっていると思いますので、ぜひご覧ください!

caddi.tech