Athena / Presto | Nie można dopasować wiersza identyfikatora w łączeniu własnym

Jan 04 2021

Próbuję uzyskać bi-gramy na kolumnie strunowej.

Podążyłem tutaj za podejściem , ale Athena / Presto podaje mi błędy na ostatnich krokach.

Dotychczasowy kod źródłowy

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

Konkretny problem, który mam, znajduje się w ostatniej linii, kiedy próbuję samodzielnie dołączyć identyfikatory transakcji - zawsze zwraca zero wierszy. Działa, jeśli dołączam tylko przez wl1.n = wl2.n-1(pozycję w tablicy), co jest bezużyteczne, jeśli nie mogę ograniczyć tego do tego samego identyfikatora.

Athena nie obsługuje funkcji ngrams firmy presto, więc mam takie podejście.

Jakieś wskazówki, dlaczego to nie działa? Dzięki!

Odpowiedzi

GordonLinoff Jan 04 2021 at 20:08

To są spekulacje. Ale zauważam, że twój CTE używa limitbez order by. Oznacza to, że zwracany jest dowolny zestaw wierszy.

Chociaż niektóre bazy danych materializują CTE, wiele z nich nie. Uruchamiają kod niezależnie za każdym razem, gdy występuje do niego odwołanie. Domyślam się, że kod jest uruchamiany niezależnie, a dowolny zestaw 50 wierszy nie ma wspólnych identyfikatorów transakcji.

Jednym z rozwiązań byłoby dodanie order by transacdtion_idpodzapytania.