Athena / Presto | ID-Zeile kann beim Self-Join nicht übereinstimmen

Jan 04 2021

Ich versuche, die Bi-Gramm auf eine String-Spalte zu bekommen.

Ich habe den Ansatz hier verfolgt, aber Athena / Presto gibt mir Fehler bei den letzten Schritten.

Quellcode bisher

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

Das spezifische Problem, das ich habe, ist in der allerletzten Zeile, wenn ich versuche, die Transaktions-IDs selbst zu verknüpfen - es werden immer null Zeilen zurückgegeben. Es funktioniert, wenn ich nur durch wl1.n = wl2.n-1(die Position auf dem Array) beitrete, was nutzlos ist, wenn ich es nicht auf dieselbe ID beschränken kann.

Athena unterstützt die ngrams-Funktion von presto nicht, daher bleibt mir dieser Ansatz.

Irgendwelche Hinweise, warum das nicht funktioniert? Vielen Dank!

Antworten

GordonLinoff Jan 04 2021 at 20:08

Das ist Spekulation. Aber ich stelle fest, dass Ihr CTE limitmit Nein verwendet order by. Das bedeutet, dass ein beliebiger Satz von Zeilen zurückgegeben wird.

Obwohl einige Datenbanken CTEs materialisieren, tun dies viele nicht. Sie führen den Code jedes Mal unabhängig aus, wenn auf ihn verwiesen wird. Ich vermute, dass der Code unabhängig ausgeführt wird und der beliebige Satz von 50 Zeilen keine gemeinsamen Transaktions-IDs hat.

Eine Lösung wäre, order by transacdtion_iddie Unterabfrage hinzuzufügen.