BigQuery ANY_VALUE недетерминированный?

#sql #google-bigquery

#sql #google-bigquery

Вопрос:

Является ли BigQuery ANY_VALUE детерминированным? У меня есть запрос, который выдает ~ 200 000 строк результатов, но если я отфильтровываю повторяющиеся записи после запроса, они уменьшаются примерно до ~ 500. Чтобы решить эту проблему в самом запросе, я добавил GROUP BY, а затем обернул все атрибуты `ANY_VALUE(tN.fieldX) как tN_fieldX . Выходные данные, после сортировки, сохранения в формате .csv и выполнения несколько раз, возвращают один и тот же файл результатов md5sum.

Означает ли это, что ANY_VALUE решает мою проблему повторяющихся записей, потому что каждый раз он будет давать разные значения из-за того, что он недетерминирован в BigQuery?

Ответ №1:

Очевидно, что ANY_VALUE недетерминирован — но если вы применяете функцию к GROUP’ed ПО значению — она становится детерминированной в том смысле, что случайным образом выбирает значение из группы одинаковых значений. Итак, да — это помогает в решении проблемы дубликатов в случаях, подобных вашему

Ответ №2:

Я думаю, это довольно ясно в документации:

ANY_VALUE

 ANY_VALUE(expression)  [OVER (...)]
  

Описание

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

Если вы зависите от определенного возвращаемого значения, вы рискуете, что в какой-то момент оно не сработает.

Вместо этого я бы рекомендовал использовать оконные функции:

 select t.* except (seqnum)
from (select t.*,
             row_number() over (partition by . . . order by . . . ) as seqnum
      from t
     ) t
where seqnum = 1;
  

Это гарантирует, что все значения взяты из одной строки, и вы можете контролировать, из какой строки они берутся — при условии, что у вас есть что-то, чтобы однозначно идентифицировать каждую строку.