Как случайным образом перемешать все строки большой таблицы в наборе данных BigQuery? - PullRequest
1 голос
/ 04 июня 2019

Память, необходимая для запроса, подобного "select id from table order by rand()", превысит выделенную память, что приведет к сбою запроса. Как я могу получить случайную перестановку всех строк из довольно большой таблицы? Размер таблицы превышает 1 миллиард строк.

1 Ответ

2 голосов
/ 05 июня 2019

Бизнес нашей команды требует повторной выборки из всего набора данных.Размер выборки каждый раз варьируется от 80 миллионов до 100 тысяч ...

Ниже приведен пример для BigQuery Standard SQL, в котором используется таблица с 12+ миллиардами строк, поэтому он также должен работать для вас: o)

Шаблон для запроса:

#standardSQL
SELECT start_position 
FROM `bigquery-public-data.genomics_rice.Rice3K_DeepVariant_Os_Nipponbare_Reference_IRGSP_1_0`
WHERE MOD(CAST(<total number of rows in table> * RAND() AS INT64), <ratio of sample>) = 1

Формально = CAST (/ AS INT64)
И вместо 1 в = 1 - может быть любое целое число от 0 до <ratio of sample> - 1

Таким образом, для выборки 100K - вы можете использовать

#standardSQL
SELECT start_position 
FROM `bigquery-public-data.genomics_rice.Rice3K_DeepVariant_Os_Nipponbare_Reference_IRGSP_1_0`
WHERE MOD(CAST(12186710727 * RAND() AS INT64), 121867) = 1

Выше возвращено 99 770 строк выборки за 8 секунд

А для выборки 80M - вы можете использовать

#standardSQL
SELECT start_position 
FROM `bigquery-public-data.genomics_rice.Rice3K_DeepVariant_Os_Nipponbare_Reference_IRGSP_1_0`
WHERE MOD(CAST(12186710727 * RAND() AS INT64), 152) = 1    

вернуло 80 175 660 строк выборки за 13 секунд

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...