1. ホーム
  2. google-cloud-platform

Google BigQueryにおけるランダムサンプリング

2023-07-25 22:52:55

質問

RAND()関数が、文書化されていないものの、BigQueryで動作することを発見したところです。私は、Shakespeareデータセットから10個の単語の(一見)ランダムなサンプルを生成することができました。

SELECT word FROM
(SELECT rand() as random,word FROM [publicdata:samples.shakespeare] ORDER BY random)
LIMIT 10

質問ですが、リファレンスマニュアルの "Advanced examples" の項で定義されている HASH() メソッドの代わりに、この方法を使用することにデメリットはありますか? https://developers.google.com/bigquery/query-reference

どのように解決するのですか?

層別サンプリングについては https://stackoverflow.com/a/52901452/132438


よくぞ見つけてくれました :)。最近、この機能をリクエストしたのですが、まだドキュメントにはなっていないようです。

RAND()の利点は結果が変化することで、HASH()は同じ値に対して同じ結果を出し続けることだと言えるでしょう(長期間保証されるわけではありませんが、イメージはつかめると思います)。

RAND()がもたらす多様性と同時に一貫した結果を得たい場合、RAND(3)のように整数でシードすることが可能です。

しかし、貼り付けた例では、ランダムな値の完全なソートを実行していることに注意してください。

スケーラブルなアプローチで、およそ10個のランダムな行を取得します。

SELECT word
FROM [publicdata:samples.shakespeare]
WHERE RAND() < 10/164656

( ここで、10 は取得したい結果のおおよその数で、164656 はそのテーブルが持つ行の数です。 )


標準SQLの更新です。

#standardSQL
SELECT word
FROM `publicdata.samples.shakespeare`
WHERE RAND() < 10/164656

とかでもいい。

#standardSQL
SELECT word
FROM `publicdata.samples.shakespeare`
WHERE RAND() < 10/(SELECT COUNT(*) FROM `publicdata.samples.shakespeare`)