80

ドキュメント化されていませんが、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

4

5 に答える 5

105

層化サンプリングについては、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`)
于 2014-04-29T22:26:19.653 に答える
18

RAND() が利用可能であることを知ってよかったです!

私の場合、定義済みのサンプル サイズが必要でした。行の総数を知り、合計行に対してサンプル サイズを除算する必要がある代わりに、次のクエリを使用しています。

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

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

于 2015-11-03T13:17:44.357 に答える
8

さらに簡単にするための追加のヒント: 関数自体で注文できます。つまり、次のようになります。

y から x を選択 rand() 制限 100 で並べ替える

=> 100 のサンプル

于 2017-09-01T11:46:59.823 に答える