アテナ/プレスト| 自己結合で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を自己結合しようとすると、最後の行にあります。常にゼロ行が返されます。wl1.n = wl2.n-1(配列上の位置)だけで結合した場合は機能しますが、同じIDに制限できない場合は役に立ちません。

Athenaはprestoによるngrams関数をサポートしていないので、私はこのアプローチを残しています。

これが機能しない理由はありますか?ありがとう!

回答

GordonLinoff Jan 04 2021 at 20:08

これは憶測です。しかし、私はあなたのCTEがなしで使用limitしていることに注意しますorder by。これは、任意の行のセットが返されることを意味します。

一部のデータベースはCTEを具体化しますが、多くはそうではありません。参照されるたびに、コードを個別に実行します。私の推測では、コードは独立して実行され、50行の任意のセットには共通のトランザクションIDがありません。

1つの解決策はorder by transacdtion_id、サブクエリを追加することです。