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料金
- 料金|BigQuery: クラウド データ ウェアハウス | Google Cloud
- コストの見積りと管理 | BigQuery | Google Cloud
- BigQueryのクエリにかかる分析料金確認方法 #BigQuery - Qiita
ベストプラクティス
地雷踏みまくって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で150万円溶かした人の顔 #BigQuery - Qiita
- #JADEの日常 BigQueryで設定間違って80万溶かしたんですが、無事帰ってきた! 2022/2/21 - ブログ - 株式会社JADE
- BigQueryでクエリ一撃で29万円溶かしたけど助かった人の顔 | Futurismo
BigQuery Howto
❓日付ごとにテーブルを管理するには?
かつては日付別テーブルという, テーブル名_yyyymmddというような名前のテーブルを作成するといい感じに整理してくれる機能があった. しかし現在は, 時間分割テーブルというものができて, 日付別(シャーティングと呼ばれいてる方法)がバッドプラクティスになっている.