Случайная выборка в 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

Ответ 1

Хорошая работа в поиске :). Я недавно запросил функцию, но пока не дошел до документации.

Я бы сказал, что преимущество RAND() заключается в том, что результаты будут отличаться, в то время как HASH() будет давать вам одинаковые результаты для одних и тех же значений (не гарантируется с течением времени, но вы получаете идею).

Если вам нужна изменчивость, которую RAND() приносит, все еще получая согласованные результаты, вы можете засеять ее целым числом, как в RAND (3).

Обратите внимание, что пример, который вы вставили, выполняет полный вид случайных значений - для достаточно больших входов этот подход не будет масштабироваться.

Масштабируемый подход, чтобы получить около 10 случайных строк:

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

(где 10 - приблизительное количество результатов, которые я хочу получить, и 164656 количество строк, которые есть в таблице)


Стандартное обновление:

#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')

Ответ 2

Замечательно знать RAND()!

В моем случае мне нужен предопределенный размер выборки. Вместо того, чтобы знать общее количество строк и размер выборки деления по всем строкам, я использую следующий запрос:

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

Суммируя, я использую ORDER BY + LIMIT для ramdomize, а затем извлечения определенного количества выборок.

Ответ 3

Один дополнительный совет, чтобы сделать его еще проще: вы можете заказать его функцию, то есть:

выберите x из y order by rand() limit 100

=> Образец 100