Upgrade to Pro — share decks privately, control downloads, hide ads and more …

BigQuery経由で使うGoogleスプレッドシートのスキーマ管理

 BigQuery経由で使うGoogleスプレッドシートのスキーマ管理

Takashi Masuda

July 21, 2022
Tweet

More Decks by Takashi Masuda

Other Decks in Technology

Transcript

  1. BigQueryのデータソース 種別 メカニズム データソース/データ ベース 形式 BigQueryストレージ 外部データソース 外部テーブル Bigtable

    Cloud Storage (GCS) CSV, JSON など Googleドライブ カンマ区切り値(CSV) JSON(改行区切り) Avro スプレッドシート 連携クエリ Cloud Spanner Cloud SQL 外部データソースの概要 | BigQuery | Google Cloud
  2. BigQuery経由で使った場合の比較 BigQueryストレージ Googleスプレッドシート ビジネスユー ザーがデータを 更新可能 難しい 簡単 ビジネスユー ザーがスキーマ

    を変更可能 難しい 例えば列を挿入すると、クエ リエラーになる 扱えるデータ量 気にしなくて良い 上限1,000万セルだが、実際 は数万行でクエリタイムアウ トなどが発生し始める Google ドライブに保管可能なファイル - Google ドライブ ヘルプ
  3. 課題 • スキーマの変更履歴をGitに記録できない ◦ なぜ変更したのか?をあとから追跡しづらい • スキーマを破壊的に変更しづらい ◦ 一度作ったテーブルのカラムは変更や削除が出来ない。追加なら出来る ◦

    例えばあるカラムを削除したくなった時は、変更したいテーブルと同じスキーマのテーブル を作りつつ、削除したいカラムは含めないようにする ◦ その後、LookMLからのテーブル参照を切り替える
  4. bq CLIを使う 1. データセットの作成 ◦ $ bq mk <dataset_name> ◦

    例: $ bq mk masterdata 2. 外部テーブルの作成 ◦ $ bq mk --external_table_definition=./define.json <dataset_name>.<table_name> ◦ 例: $ bq mk --external_table_definition=./define.json masterdata.gsheet
  5. ポイント • bq CLIを使う ◦ ローカルにCloud SDKをインストールすれば使える ▪ Cloud SDK

    のインストール | Google Cloud ◦ macOSなら $ brew install --cask google-cloud-sdk でのインストールが楽かも • スキーマ定義をdefine.jsonで管理する ◦ 例: https://gist.github.com/masutaka/142ca20b802401d12012fe952f2ea1f3
  6. 宣伝など • 割とニッチなLookerのブログ記事を書いています🔥 ◦ Looker カテゴリーの記事一覧 - Feedforce Developer Blog

    • ソフトウェア開発の経験を生かしたLookML開発を続けて いますが、ずっとボッチなので一度誰かと意見交換など してみたいです🙏 ◦ 特にLookMLのレイヤー化の話は試行錯誤中で興味あります
  7. SQLのビューを間に挟む例 例えば、全カラムnullのレコードが急に出てくることがある。primary_keyがnullになり得るので避けた いところ。LookMLの派生テーブルでも解決出来るが、BigQueryの責務にしたほうがLookMLをシンプル に保てると思う。 # SQLのビューとして、例えばこんなSQLのファイルを用意する $ cat all_data_view.sql SELECT

    DISTINCT * FROM `project_name.masterdata.gsheet` WHERE id IS NOT NULL $ bq mk --use_legacy_sql=false --view "$(cat all_data_view.sql)" masterdata.all_data_view # LookML → SQLのビュー → 外部テーブル 人間が作るテーブルでありがちな、ピボットされたテーブルのピボット解除もSQLのビューでやると良い 気がする。