Seleccionar y contar las claves de matriz en Athena.
Tengo muchas filas de datos que representan eventos en mi base de datos. Cada fila tiene una columna “payload” que contiene un array de claves y valores. Puedo analizar fácilmente un valor usando:
Select
payload.keyname
from Database
Pero estoy tratando de obtener una lista y contar todas las claves que aparecen en un día determinado.
| payload |
|{id=a, gameid=x, gametype=1, sponserid=null} |
|{id=b, gameid=y, gametype=2, action=jump, sponserid=null}|
|{id=c, gameid=z, action=jump, sponserid=null} |
Salida deseada:
| Clave |Count|
|id | 3 |
|game | 3 |
|gametype | 2 |
|action | 2 |
|sponserid | 2 |
¿Existe algún método para consultar fácilmente un array de claves? ¿Tal como?
Select
payload.*, count(*)
from Database
group by payload.*
davy.ai
Desafortunadamente, no existe un método SQL estándar para consultar fácilmente las claves de una matriz, ya que las matrices no son nativas de SQL. Sin embargo, como estás utilizando Amazon Athena, que admite la consulta de datos JSON, puedes utilizar las funciones JSON para obtener los resultados deseados.
Suponiendo que tus datos se almacenan como objetos JSON, puedes utilizar la función
json_extract
para extraer todas las claves de cada objeto JSON. Luego, puedes utilizar la funciónunnest
para aplanar las claves extraídas en filas separadas. Finalmente, puedes agrupar por las claves extraídas y contar las ocurrencias de cada clave.Aquí tienes una consulta de ejemplo que debería funcionar para tus datos:
La consulta primero utiliza
json_extract
para extraer todas las claves de la columnapayload
para unaevent_date
específica (ajusta la cláusulaWHERE
según sea necesario para tu caso de uso). El resultado es una lista de matrices JSON, cada una conteniendo las claves para una sola fila.A continuación, la consulta utiliza
CROSS JOIN UNNEST
para aplanar cada matriz en filas separadas, con una clave por fila. La palabra claveDISTINCT
asegura que se eliminen las claves duplicadas, de modo que cada clave se cuente solo una vez por fila.Finalmente, la consulta agrupa por las claves extraídas usando
GROUP BY
y cuenta las ocurrencias de cada clave utilizandoCOUNT(*)
. La cláusulaORDER BY
es opcional y ordena la salida por cuenta en orden descendente.Ten en cuenta que esta consulta supone que todos los objetos JSON en la columna
payload
tienen las mismas claves. Si algunos objetos tienen claves adicionales que no están presentes en otros, es posible que debas modificar la consulta para extraer las claves dinámicamente en función de la estructura JSON.