Решение состоит в том, чтобы использовать хеш-функцию для одного столбца, которая однозначно распознает каждую строку вашей исходной таблицы (например, здесь orderId
).
BigQuery имеет хеш-функцию, котораяТип цели: INT64
(и источник STRING
или BYTES
): FARM_FINGERPRINT
(из здесь ).
Решение заключается в кодировании каждой строки в соответствии с ееFARM_FINGERPRINT(orderId)
, который является выборкой из равномерного распределения всех INT64
чисел.
Для данного k
, MOD(ABS(FARM_FINGERPRINT(orderId)),k)
представляет собой равномерное распределение целых чисел в [0,k-1]
(Осторожно, что MOD(a,b)
с a
отрицательным и b
положительным может вернуть отрицательное число).
Таким образом, предположим, что вы хотите разделить на 10% / 90%.
Запросы для каждого из разбиений будут выглядеть следующим образом:
SELECT
*
FROM
`mytable`
WHERE MOD(ABS(FARM_FINGERPRINT(orderId)),10) = 0
и
SELECT
*
FROM
`mytable`
WHERE MOD(ABS(FARM_FINGERPRINT(orderId)),10) != 0
Его можно обобщить на любое разбиение 1 / k:
SELECT
*
FROM
`mytable`
WHERE MOD(ABS(FARM_FINGERPRINT(orderId)),@k) = 0
и
SELECT
*
FROM
`mytable`
WHERE MOD(ABS(FARM_FINGERPRINT(orderId)),@k) != 0
Изменение значения целого числа дискриминирующего мода (0
в приведенном выше) позволяетдо k
различных разбиений (что может быть очень полезно, например, если вы выполняете многократную перекрестную проверку в ML).
Последнее, но не менее важное:
- сгибыдобавление данных в таблицу
- сгибы остаются неизменными при каждом выполнении запросов