Athena / Presto | No se puede coincidir con la fila de ID en la autounión

Jan 04 2021

Estoy tratando de obtener los bi-gramas en una columna de cuerda.

He seguido el enfoque aquí, pero Athena / Presto me está dando errores en los pasos finales.

Código fuente hasta ahora

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

El problema específico que tengo está en la última línea, cuando intento unirme a los ID de transacción, siempre devuelve cero filas. Funciona si me uno solo por wl1.n = wl2.n-1(la posición en la matriz), lo cual es inútil si no puedo restringirlo a una misma identificación.

Athena no admite la función ngrams por presto, así que me quedo con este enfoque.

¿Alguna pista de por qué esto no funciona? ¡Gracias!

Respuestas

GordonLinoff Jan 04 2021 at 20:08

Eso es especulación. Pero observo que su CTE está usando limitcon no order by. Eso significa que se devuelve un conjunto arbitrario de filas.

Aunque algunas bases de datos materializan CTE, muchas no lo hacen. Ejecutan el código de forma independiente cada vez que se hace referencia a él. Supongo que el código se ejecuta de forma independiente y el conjunto arbitrario de 50 filas no tiene ID de transacción en común.

Una solución sería agregar order by transacdtion_idla subconsulta.