web-dev-qa-db-ja.com

Google BigQueryのランダムサンプリング

Rand()関数は、文書化されていませんが、BigQueryで機能することを発見しました。以下を使用して、シェークスピアデータセットから(一見)ランダムな10単語のサンプルを生成できました。

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

私の質問は、リファレンスマニュアルの「高度な例」のセクションで定義されているHASH()メソッドの代わりに、このアプローチを使用することの欠点はありますか? https://developers.google.com/bigquery/query-reference

50
David M Smith

層別サンプリングについては、 https://stackoverflow.com/a/52901452/132438を確認してください


それを見つける良い仕事:)。この機能を最近リクエストしましたが、まだ文書化されていません。

Rand()の利点は、結果が変化することです。一方、HASH()は同じ値に対して同じ結果を提供し続けます(長期にわたって保証されませんが、アイデアは得られます)。

一貫性のある結果を得ながら、Rand()がもたらす変動性が必要な場合は、Rand(3)のように整数でシードできます。

ただし、貼り付けた例では、あらゆる種類のランダムな値を使用していることに注意してください。入力が十分に大きい場合、このアプローチはスケーリングされません。

約10のランダムな行を取得するためのスケーラブルなアプローチ:

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

ここで、10は取得する結果のおおよその数、164656はテーブルに含まれる行の数です


standardSQLの更新:

#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`)
66
Felipe Hoffa

Rand()が利用可能であることを知ってうれしいです!

私の場合、定義済みのサンプルサイズが必要でした。行の合計数を知り、合計行の分割サンプルサイズを実行する必要はなく、次のクエリを使用しています。

SELECT Word, Rand(5) as Rand
FROM [publicdata:samples.shakespeare]
order by Rand
#Sample size needed = 10
limit 10

要約すると、ORDER BY + LIMITを使用してランダム化してから、定義された数のサンプルを抽出します。

8
fernandosjp

さらに簡単にするためのもう1つのヒント:関数itで並べ替えることができます。

rand()制限100でyからxを選択

=> 100のサンプル

2