Вместо того, чтобы идти в направлении UDF, вы можете попробовать BigQuery GIS (общедоступная альфа) * 1001 *
На основе вашего примера - это может выглядеть примерно так, как показано ниже: упрощенный / глупый пример
#standardSQL
WITH start AS (
SELECT
state_name state,
CAST(internal_point_lat AS FLOAT64) lat,
CAST(internal_point_lon AS FLOAT64) lon
FROM `bigquery-public-data.utility_us.us_states_area`
WHERE state_name IN ('California', 'Arizona')
), finish AS (
SELECT
state_name state,
CAST(internal_point_lat AS FLOAT64) lat,
CAST(internal_point_lon AS FLOAT64) lon
FROM `bigquery-public-data.utility_us.us_states_area`
WHERE state_name IN ('Florida', 'New York')
)
SELECT
start.state start,
finish.state finish,
ROUND(ST_DISTANCE(ST_GEOGPOINT(start.lon,start.lat),ST_GEOGPOINT(finish.lon,finish.lat))*0.000621371,2) distance
FROM start, finish
Row start finish distance
1 California Florida 2223.17
2 California New York 2331.66
3 Arizona Florida 1761.82
4 Arizona New York 2019.12
Примечание: BQ-GIS находится в общедоступной альфа-версии, поэтому ваш проект GCP должен быть включен в белый список, чтобы выполнить эти запросы. Вы можете зарегистрироваться, чтобы запросить доступ здесь .
Обновление ( на основе комментария )
Понятно. таким образом, пример ГИС был просто «случайным» примером и вообще не был предметом обсуждения. Понял. Что касается UDF - в настоящее время BigQuery поддерживает только JavaScript и SQL UDF, а также поддерживаются внешние библиотеки JS UDF. Java / Python пока не повезло. Единственный другой сумасшедший вариант, который вы можете проверить - это использование веб-сборки.
Вы можете проверить несколько примеров, чтобы получить представление: