Ponz Dev Log

ゆるくてマイペースな開発日記

GCP BigQueryチュートリアルお触りメモ

GCPのData Engineer認定試験に向けて、データウェアハウスに分類されるBigQueryのチュートリアルを一周したのとドキュメントを読み漁った時のメモです。最近メモ続きで今回はコードは一行も出てきませんが、試験直前に見直すために書き残します。そろそろパイプラインとか自前で作ってみないと。。。

データロード方法

データを流し込むのは以下の方法がある。

データロードのTips

  • 直接ファイルをBQに入れると Upload -> Importの二段階が走って途中でこけると悲しい。GCS経由だと10倍程度早いようだ。
  • 圧縮データでロードする場合は、Avroが最適、次点がPurquet。圧縮率が高いのに、並列読み込みできるから。
  • CSVJSONファイルは、gzip圧縮よりも圧縮なしの方が早い。
  • 基本は文字コード UTF-8で入れること。ISO-8859-1でも読み込み可能だが、UTF-8に変換しながら読み込むため遅い。

テーブル構造

  • 構造化データを入れる
    • ただし、JSONのようにネストした形式のデータでもOK。この場合は、カラム名comitter.name,comitter.timestamp のようにドットつなぎ
    • スキーマは手動で定義するか、サポートされたファイルから読み込む場合は自動検出で定義可能。

ストリーム処理

  • ストリーミングの上限10.000行 / sec
  • ストリーミングインサートするときは、上記の上限に引っかからないようにDataflowを噛ませた方が良さそう。
  • DataflowならPub/Sub, GCS, JDBC(アプリ経由)のテンプレートが用意されているから使うハードルは低い。
  • バッチは強力な整合性、ストリーミングは結果整合性と整合性の性質が異なる。(チュートリアルでFluentd -> BQの場合は1分くらいラグがあった)

課金の話

  • 課金対象は、読み込んだ行数 で決まるので出力結果だけ絞っても金額は絞らない場合と変わらない。(よって、LIMIT句を加えても課金額は変わらない!!)
    • 全ての列を読み込む SELECT * は最低の所業。必要な列だけ取りなさい。
    • テーブルの中身を見るだけなら、プレビューを使おう。単に中身をチラ見するだけなのにクエリを投げるのは課金されるので無駄。
    • 特定の期間のデータのみクエリしたい場合は、時系列のパーティション属性(隠しフィールド扱い?)を使って、時系列パーティションでクエリを投げよう。
    • JOINが多い/共通のクエリがあるならば、事前に中間テーブルを作ろう。

権限設定周り

模擬試験でも出てきて焦ったところだけれども、この人にはこのデータセットは見せたくないとか権限設定は大事。

  • アクセス制御の基本はここを参照
  • 権限設定はプロジェクトレベルが適用されて、あとはデータセット単位(?)
  • 役割ごとに見せたいビューやデータセットを制限したい場合は、データセットを分けること。
  • データセットの権限付与と承認は新しいコンソール画面からじゃできない。"従来のUI”からのみ実行可能。