Fuzzymatch в BigQuery

Оптимизация производительности BigQuery Fuzzymatch

Привет, в настоящее время я экспериментирую с запуском алгоритма нечеткого соответствия непосредственно в Big Query и хочу получить некоторые рекомендации о том, как мой текущий подход можно оптимизировать. Я хочу выполнить поиск нечетких совпадений там, где они есть table A с участием input струны и другое table B с участием phrasesстроки, которые я хочу проверить. Я использую JavaScript UDF для реализации следующим образом:

CREATE OR REPLACE FUNCTION `project.functions.fuzzymatch`(a string, b string)
RETURNS INT64
DETERMINISTIC
LANGUAGE js AS """
return fuzzball.token_set_ratio(a,b,{full_process: false});
"""
OPTIONS (library="gs:///fuzzball.umd.min.js");

create or replace table `tbl_fuzzymatch_output` as
with applied as (
select
t.input_id,
t.input,
s.value,
project.functions.fuzzymatch(t.input,s.value) as score
from
tbl_A t
cross join tbl_B s
)

select
input_id,
input,
value,
array_agg(struct(value, score)) matches
from applied
group by input_id, input

Хотя это уже работает достаточно быстро для моего тестового набора (10MN входов и 2500 значений), меня беспокоит масштабируемость, если моя таблица A имеет миллионы или даже миллиарды записей из-за использования перекрестного соединения.

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

Мой вопрос: есть ли способ ускорить выполнение запроса, избегая перекрестного соединения и не сохранять данные в столбце массива? Возможно, мы сможем кэшировать список фраз table Bкак-нибудь? Рад любой идее и вашему опыту, спасибо!

С уважением, Стефан

0 ответов

Другие вопросы по тегам