LoginSignup
1

More than 3 years have passed since last update.

BigQueryのパーティション分割テーブルのパーティション毎のデータ量を求める

Last updated at Posted at 2020-12-10

BigQueryはパーティション分割テーブルを使うことで、パフォーマンスやコストを最適化することができます。

しかし、公式のドキュメントには分割された各パーティション毎のデータサイズを求める方法が書かれていません。

__PARTITIONS_SUMMARY__ メタテーブルを使うことで、パーティションの一覧やそれらの作成・更新時刻を確認することはできますが、このテーブルにサイズの情報はありません。
では、どうやってパーティション毎のサイズを確認できるのでしょうか?

解決策

各パーティションに対して、パーティション内をフルスキャンするクエリをdry runし、推定スキャン量のデータを使う。

partitions = [
  '2020-01-01',
  '2020-01-02',
  '2020-01-03',
]

partitions.each do |partition|
  sql = "SELECT * FROM <テーブル名> WHERE DATE(<パーティションカラム>) = '#{partition}'"
  command = "bq query --nouse_legacy_sql --dry_run \"#{sql}\""

  res = `#{command}`
  m = res.match(/(\d+) bytes/)

  if m
    bytes = m[1].to_i
    puts "#{partition}, #{bytes}"
  end
end

dry runであればクエリ料金がかからないことを利用して、パーティションのサイズを調査しています。
あとは、この情報をCSVとしてGoogle SheetやBQに入れることでさらなる調査ができます。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1