BigQuery の2021年3月のアップデートにTABLESAMPLEがありました。ちょっと試してみたいと思います。
TABLESAMPLE オペレータ
対象のテーブルが大量でサンプリングしたい場合に有効そうです。使い方は、簡単以下のように FROM の後のテーブルに TABLESAMPLE SYSTEM (x PERCENT) をつけるだけ。
例えば、全量に対して10%のデータをサンプリングしたい場合、次のようなクエリになります。
SELECT
COUNT(1) AS c
FROM
`bigquery-public-data.samples.wikipedia` TABLESAMPLE SYSTEM (10 PERCENT)
こちらのテーブルは全量 313,797,035 件に対して、以下のような結果になります。
約10%ですね、きれいに10%にはならない仕様で、それはBigQueryがデータを複数件まとめたブロックという単位で分割して保存しており、そのブロック単位でサンプリングするからと公式Docに書いてあります。
なので、より正確に10%のデータを取りたい場合は、次のようにして TABLESAMPLE で絞りつつ、rand() 関数でサンプリングするという方法が同Docで提案されています。
SELECT
COUNT(1) AS c
FROM
`bigquery-public-data.samples.wikipedia` TABLESAMPLE SYSTEM (50 PERCENT)
WHERE rand() < 0.2
あと、TABLESAMPLE を使った場合、キャッシュが聞かないので、毎回クエリが実際に走ります。
料金は、サンプリングしたブロックに絞られるようですので、シンプルに rand() のみ使いサンプリングするよりコストやパフォーマンスが改善できそうです。(参考)
