Athena / Presto | 자체 조인의 ID 행과 일치 할 수 없습니다.

Jan 04 2021

문자열 열에서 바이그램을 얻으려고합니다.

여기서 접근 방식을 따랐 지만 Athena / 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

내가 겪고있는 특정 문제는 트랜잭션 ID를 자체 조인하려고 할 때 맨 마지막 줄에 있습니다. 항상 0 행을 반환합니다. wl1.n = wl2.n-1동일한 ID로 제한 할 수 없으면 쓸모없는 (배열의 위치) 로만 결합하면 작동합니다 .

Athena는 presto의 ngrams 기능을 지원하지 않으므로이 접근 방식이 남아 있습니다.

이것이 작동하지 않는 이유는 무엇입니까? 감사!

답변

GordonLinoff Jan 04 2021 at 20:08

이것은 추측입니다. 그러나 나는 당신의 CTE 사용하지 있습니다 limit더와 order by. 즉, 임의 의 행 집합이 반환됩니다.

일부 데이터베이스는 CTE를 구체화하지만 대부분은 그렇지 않습니다. 참조 될 때마다 코드를 독립적으로 실행합니다. 내 생각에는 코드가 독립적으로 실행되고 임의의 50 행 집합에는 공통된 트랜잭션 ID가 없다는 것입니다.

한 가지 해결책은 order by transacdtion_id하위 쿼리 를 추가하는 것 입니다.