Афина / Престо | Не удается сопоставить строку идентификатора при самостоятельном присоединении

Jan 04 2021

Я пытаюсь получить биграммы на строковом столбце.

Я следовал подход здесь , но Афина / Presto дает мне ошибки на заключительных этапах.

Исходный код на данный момент

with word_list as (
    SELECT 
      transaction_id, 
      words, 
      n, 
      regexp_extract_all(f70_remittance_info, '([a-zA-Z]+)') as f70,
      f70_remittance_info
    FROM exploration_transaction
    cross join unnest(regexp_extract_all(f70_remittance_info, '([a-zA-Z]+)')) with ordinality AS t (words, n)
    where cardinality((regexp_extract_all(f70_remittance_info, '([a-zA-Z]+)'))) > 1
    and f70_remittance_info is not null
    limit 50 )
select wl1.f70, wl1.n, wl1.words, wl2.f70, wl2.n, wl2.words
from word_list wl1
join word_list wl2 
on wl1.transaction_id = wl2.transaction_id

Конкретная проблема, с которой я сталкиваюсь, находится в самой последней строке, когда я пытаюсь самостоятельно присоединиться к идентификаторам транзакций - она ​​всегда возвращает нулевые строки. Он работает, если я присоединяюсь только к wl1.n = wl2.n-1(позиции в массиве), что бесполезно, если я не могу ограничить его одним и тем же идентификатором.

Athena не поддерживает функцию ngrams от presto, поэтому я остался с этим подходом.

Есть какие-нибудь подсказки, почему это не работает? Спасибо!

Ответы

GordonLinoff Jan 04 2021 at 20:08

Это предположение. Но отмечу, что ваш CTE использует limitбез order by. Это означает, что возвращается произвольный набор строк.

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

Одним из решений было бы добавить order by transacdtion_idподзапрос.