BigQuery - использование SQL UDF в предикате соединения - PullRequest
0 голосов
/ 26 февраля 2019

Я пытаюсь использовать SQL UDF при запуске левого соединения, но получаю следующую ошибку:

Подзапрос в предикате соединения должен зависеть только от одной стороны соединения.

Запрос:

CREATE TEMPORARY FUNCTION game_match(game1 STRING,game2 STRING) AS (
  strpos(game1,game2) >0
);

SELECT 
  t1.gameId 
  FROM `bigquery-public-data.baseball.games_post_wide` t1
  left join `bigquery-public-data.baseball.games_post_wide` t2 on t1.gameId=t2.gameId and game_match(t1. gameId, t2.gameId)

При записи встроенного условия вместо вызова функции (strpos(t1. gameId, t2. gameId) >0) запрос работает.

Есть ли что-то проблематичное в этой конкретной функцииили, вообще говоря, SQL UDF не поддерживаются в предикате соединения (по какой-то причине)?

1 Ответ

0 голосов
/ 26 февраля 2019

Вы можете отправить запрос функции на систему отслеживания проблем , чтобы сделать эту работу.Это ограничение планирования / оптимизации запросов;для некоторого фона BigQuery преобразует вызов функции так, что логическое представление запроса выглядит следующим образом:

SELECT 
  t1.gameId 
FROM `bigquery-public-data.baseball.games_post_wide` t1
left join `bigquery-public-data.baseball.games_post_wide` t2
on t1.gameId=t2.gameId
  and (SELECT strpos(game1,game2) > 0 FROM (SELECT t1.gameId AS game1, t2.gameId AS game2))

Причина, по которой BigQuery преобразует вызов SQL UDF следующим образом, заключается в том, что ему нужно избегать вычисления входных данных больше, чемодин раз.Хотя это не проблема в данном конкретном случае, это имеет значение, если вы ссылаетесь на один из входных данных более одного раза в теле UDF, например, рассмотрите этот UDF:

CREATE TEMP FUNCTION Foo(x FLOAT64) AS (x - x);
SELECT Foo(RAND());

Если BigQuery должен был встроить выражениенепосредственно, вы получите в итоге:

SELECT RAND() - RAND();

Результат не будет нулевым, что является неожиданным, учитывая определение UDF.

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

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