Redshift: Есть ли способы вычислить нечеткое сходство строк/расстояние редактирования строки?

В PSQL (на котором, как мне кажется, основан Redshift) есть функции подобия строк, такие как levenshtein / levenshtein_less_equal [ http://www.postgresql.org/docs/9.1/static/fuzzystrmatch.html]. Эти функции, похоже, не вошли в Redshift [ http://docs.aws.amazon.com/redshift/latest/dg/String_functions_header.html]. Я ошибаюсь, или кто-нибудь сделал творческий запрос, чтобы обойти это ограничение?


person gatoatigrado    schedule 27.10.2014    source источник


Ответы (1)


Redshift основан на Postgres 8.0, который очень стар (и больше не поддерживается), поэтому за прошедшие годы они существенно разошлись. Разрабатываемая версия Postgres в настоящее время – 9.4, а версии 8.x и 9.x Postgres имеют некоторые существенные отличия и дополнения в версии 9.0 и выше.

Функция levenshtein является частью модуля fuzzystrmatch, на который вы ссылались выше, и этот модуль был представлен в Postgres 8.3, вероятно, поэтому он не вошёл в состав Redshift. (и, по-видимому, с тех пор он не был добавлен).

Обычно я бы сказал, что лучше всего определить пользовательскую функцию PL/pgSQL для реализации алгоритма Расстояние Левенштейна, но в соответствии с документ Redshift, Определяемые пользователем функции и хранимые процедуры являются одной из многих основных функций Postgres, которые Redshift не поддерживает, поэтому я думаю, что вам, к сожалению, не повезло в этом плане.

В зависимости от ваших требований вы можете использовать LIKE для достижения аналогичных результатов. См. этот ответ SO для получения дополнительной информации об этом (обратите внимание, что некоторые альтернативные предложения в этом ответе, такие как полный текст также не поддерживается в Redshift).

Обновление от 25 апреля 2016 г.

Похоже, что, поскольку я впервые ответил на этот вопрос еще в октябре 2014 года, появилась возможность создавать на основе Python Определяемые пользователем функции (UDF). Это не так идеально, как возможность создавать собственную встроенную функцию Postgres (в документе перечислено множество предостережений для UDF), но должно позволить алгоритм расстояния Левенштейна, который должен быть реализован на Python и обработан в контексте запроса Redshift.

UDF в Apache Hive, проекте хранилища данных, используемом в экосистеме Hadoop, допускает пользовательские функции аналогичным образом (Java или Python).

person khampson    schedule 28.10.2014