问题描述
我遵循了 here 的方法,但 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 功能,所以我只剩下这种方法了。
为什么这不起作用的任何线索? 谢谢!
解决方法
这是猜测。但我注意到您的 CTE 使用的是 limit
而没有 order by
。这意味着正在返回一组任意行。
尽管一些数据库实现了 CTE,但许多数据库没有实现。每次引用时,它们都会独立运行代码。我的猜测是代码是独立运行的,任意一组 50 行没有共同的事务 ID。
一种解决方案是在子查询中添加 order by transacdtion_id
。