Google Cloud BigQuery

🔖GCPのサービスのひとつ, データ分析サービス.

🐣BigQuery Basics

BigQuery リソースの整理  |  Google Cloud

データセット

BigQuery リソースへのアクセスを整理して制御するために使用される論理コンテナ. 他のデータベース システムのスキーマに相当.

  • ロケーションを設定できる(テータを保存する場所).
  • 1つのGoogel Cloudプロジェクトには複数のデータセットが紐付いている.

テーブル

保存されたデータそのもの. データセットには複数のテーブルが紐付いている.

3種類ある(アイコンも違う).

  • 標準の BigQuery テーブル: BigQuery ストレージに格納された構造化データ.
  • 外部テーブル: BigQuery の外部に格納されたデータを参照するテーブル.
  • ビュー: SQL クエリを使用して作成される論理テーブル.

テーブルの概要  |  BigQuery  |  Google Cloud

テーブル名の変更

ALTER TABLEで行う. ちなみに昔はできなかった, 古い記事に注意.

ALTER TABLE mydataset.mytable RENAME TO mynewtable;

分割テーブル

パーティション分割テーブル. 数値や日付ごとに自動的に区分を作成してくれるため, クエリが効率化する機能.

以前はテーブル名にsuffixをつけると日付別テーブルにする機能があったが今は分割テーブルが推奨.

❓日付ごとにテーブルを管理するには?


ref. 分割テーブルの概要  |  BigQuery  |  Google Cloud

データスキーマ

DATETIMEとTIMESTAMPの違い

DATETIMEはタイムゾーンを持たないか, TIMESTAMPはタイムゾーンを持つ.

データの読み込み

データの読み込みの概要  |  BigQuery  |  Google Cloud

  • データレコードのセットを一括で読み込む(バッチ読み込み).
    • csv/jsonファイルのuploadもこれ.
  • 個別のレコードまたはレコードのバッチをストリーミングする.
  • クエリを使用して新しいデータを生成し、結果をテーブルに追加または上書きする.
  • サードパーティのアプリケーションやサービスを使用する.

読み込みジョブ

CSVデータのUpload

ローカル ファイルからのデータの読み込み  |  Google Cloud

JSONデータのUpload

Jsonは, 1行に1つのレコードがあるような, いわゆる🔖JSONLという形式である必要がある.

ストリーミング挿入

BigQuery CLI(bq)

bqコマンド.

BigQuery API クライアントライブラリ

言語別にクライアントAPIライブラリが用意されている.

BigQuery Public Datasets

💡BigQuery料金

ベストプラクティス

地雷踏みまくって29万課金されたことを忘れない.

SELECT * をしない

データ量爆発する. 必要な列のみを選択する.

LIMIT句には何を書いてもテーブルをフルスキャンしてしまう

LIMIT句には何を書いてもテーブルをフルスキャンしてしまう.

ref. コストの見積りと管理  |  BigQuery  |  Google Cloud

代わりに SELECTで列を, WHEREで行を制限する. SELECT * xxx LIMIT x で全テーブル検索が 走ることにも注意.

WHERE句は全スキャン結果のフィルタリング効果しかない

WHERE句はクラスタリングされたテーブルにのみ効果があり, それ以外には効果がない.

たとえば, BigQueryには分割テーブルというあらかじめ前処理がされたテーブルの機能がある. よくある例は日付ごとでtimestampを条件にwhereを使えば読み取るデータ量は削減できる.

そうでなければWHEREをつかっても全データフルスキャンした結果の見やすいフィルタリングでしかない.

ref. https://cloud.google.com/bigquery/docs/partitioned-tables?hl=ja

必ずdry_runでクエリ実行のバイト数を

UIだと右上にバイト数が表示される.

https://cloud.google.com/bigquery/docs/best-practices-costs?hl=ja#perform-dry-run

課金されるバイト数を制限する

課金されるバイト数を設定で制限することができる.

UIエディタではクエリ新規作成ごとに設定する必要がある. APIやCLIだと実行時にオプションで指定.

https://cloud.google.com/bigquery/docs/best-practices-costs?hl=ja#use-query-validator

BigQueryでお金溶かした人の顔


BigQuery Howto

❓日付ごとにテーブルを管理するには?

かつては日付別テーブルという, テーブル名_yyyymmddというような名前のテーブルを作成するといい感じに整理してくれる機能があった. しかし現在は, 時間分割テーブルというものができて, 日付別(シャーティングと呼ばれいてる方法)がバッドプラクティスになっている.

🔗References