2016-07-15 3 views
0

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

SELECT * FROM [table] WHERE RAND() < percentage

Но это потребовало бы полного сканирования таблицы и нести эквивалентную стоимость. Мне интересно, есть ли более эффективные способы?

Я экспериментирую с API tabledata.list, но получил java.net.SocketTimeoutException: Read timed out, когда index очень большой (т. Е.> 10000000). Является ли эта операция не O (1)?

bigquery .tabledata() .list(tableRef.getProjectId, tableRef.getDatasetId, tableRef.getTableId) .setStartIndex(index) .setMaxResults(1L) .execute()

ответ

0

Я бы рекомендовал подкачку tabledata.list с pageToken и получить сбор строк выборки из каждой страницы. Это должно значительно улучшиться.

Другой (совершенно разные) вариант Я вижу использование Table Decorators
Вы можете в цикле грамматически генерируют случайное время (для снимка) или временные рамки (для диапазона) и запрос только что части данных извлечения необходимых данных.
Примечание: Это позволит вам сэмплировать данные, возраст которых меньше 7 дней.

+0

Моим вариантом использования является равномерное выборка небольшого фиксированного количества строк без выполнения полной таблицы ввода-вывода. Подход 'pageToken' все равно потребует пройти все строки в таблице? –

+0

nope. вы можете остановить пейджинг в любое время –

0

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

Если вы хотите выполнить некоторую операцию над всеми данными в своей таблице, но не запускать запрос, скорее всего, вы должны использовать вместо него extract job to GCS и выбирать строки из выходных файлов.

Смежные вопросы