ジェイウォークなカラムに格納された値のどれかが、リストのどれかと一致するものを検索したい


まずは結論から

SELECT * 
FROM "athena"."test_table" 
WHERE arrays_overlap(split("id_list",','), ARRAY['1','2','3','4','5'] );

前提・背景・やりたいこと ...など

  • AWS Athenaでcsvファイルに検索をかける
  • AthenaでSQLを実行するため、Prestoの利用ができる
  • csvファイルにはジェイウォーク1なカラムが含まれる
  • ジェイウォークなカラムに入っている値の"どれか"が、指定リストのどれかと一致するするものを検索したい
  • 速度は今回未考慮

解決法

Prestoに用意されている2つの関数を用いて解決

split(string, delimiter)

stringをdelimiterで区切ってARRAY型に変換

arrays_overlap(x,y)

xの要素のどれかがyの要素のどれかと一致した場合Trueを返す

まとめ

比較的簡単に書けました。
速度は実測にて耐えられるかを確認します。
(きっと速度は遅くなるのでしょう。。。)

もっといい方法があれば教えてください。
にしても、タイトルが長い...

参照

Presto 0.172 Documentation


  1. 1フィールドに複数の値がカンマ区切りで格納されているもの。本来のDBではアンチパターンだが、今回は色々な制約のもと中間ファイルを作ったり、RDBにしたりが不可なので、どうにかこのまま検索したい。