TABLESAMPLE и SAMPLE

Внимание

Поддерживается только для строковых таблиц. Поддержка функциональности для колоночных таблиц находится в разработке.

Построение случайной выборки из указанного во FROM источника данных.

TABLESAMPLE является частью SQL стандарта и работает следующим образом:

  • Указывается режим работы:

    • BERNOULLI означает «медленно, честно просмотрев все данные, но по-настоящему случайно»;
    • SYSTEM должен использовать знание о физическом хранении данных, чтобы избежать полного их чтения частично жертвуя случайностью выборки.

Данные разбиваются на достаточно большие блоки, и происходит сэмплирование данных блоков целиком. Для прикладных расчётов на достаточно больших таблицах результат вполне может оказаться состоятельным.

  • Размер случайной выборки указывается в процентах следом за режимом в круглых скобках.
  • Управлять размером блоков для режима SYSTEM можно с помощью прагмы yt.SamplingIoBlockSize. Если при семплировании размер результата получается меньше одного блока, то выдается пустой результат.
  • Опционально далее указывается ключевое слово REPEATABLE и целое число в скобках, которое будет использовано как seed для генератора псевдослучайных чисел.

SAMPLE является более коротким алиасом, где нет сложных настроек, а размер выборки указывается в долях. На данный момент он соответствует режиму BERNOULLI.

Примечание

В режиме BERNOULLI при наличии ключевого слова REPEATABLE в seed подмешивается chunk id для каждого чанка таблицы. Поэтому выборка для разных таблиц с одинаковым содержимым может давать разные результаты.

Примеры

SELECT *
FROM my_table
TABLESAMPLE BERNOULLI(1.0) REPEATABLE(123); -- один процент таблицы
SELECT *
FROM my_table
TABLESAMPLE SYSTEM(1.0); -- примерно один процент таблицы
SELECT *
FROM my_table
SAMPLE 1.0 / 3; -- треть таблицы