อาเธน่า / โอมเพี้ยง | ไม่สามารถจับคู่แถว 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

ปัญหาเฉพาะที่ฉันพบคือในบรรทัดสุดท้ายเมื่อฉันพยายามเข้าร่วมรหัสธุรกรรมด้วยตนเอง - มันจะส่งกลับศูนย์แถวเสมอ จะใช้งานได้ถ้าฉันเข้าร่วมโดยwl1.n = wl2.n-1(ตำแหน่งบนอาร์เรย์) เท่านั้นซึ่งไม่มีประโยชน์หากฉันไม่สามารถ จำกัด ให้เป็น id เดียวกันได้

Athena ไม่สนับสนุนฟังก์ชัน ngrams โดย presto ดังนั้นฉันจึงเหลือแนวทางนี้

เบาะแสใด ๆ ที่ทำไมถึงใช้งานไม่ได้? ขอบคุณ!

คำตอบ

GordonLinoff Jan 04 2021 at 20:08

นี่คือการเก็งกำไร แต่ผมทราบว่า CTE ของคุณใช้ไม่มีlimit order byนั่นหมายความว่ากำลังส่งคืนชุดแถวโดยพลการ

แม้ว่าฐานข้อมูลบางส่วนจะกลายเป็น CTE แต่ก็มีหลายฐานข้อมูลไม่ พวกเขาเรียกใช้รหัสอย่างเป็นอิสระทุกครั้งที่มีการอ้างอิง ฉันเดาว่ารหัสทำงานอย่างอิสระและชุด 50 แถวโดยพลการไม่มีรหัสธุรกรรมเหมือนกัน

วิธีแก้ปัญหาหนึ่งคือการเพิ่มorder by transacdtion_idในแบบสอบถามย่อย