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
как-нибудь? Рад любой идее и вашему опыту, спасибо!
С уважением, Стефан