es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Transformar JSON a ARRAY en Athena/Presto

Tengo una tabla disponible en Athena que tiene una columna con JSON estructurado de la siguiente manera:

{
    "455a9410-29a8-48a3-ad22-345afa3cd295":
    {
        "legacy_id": 1599677886,
        "w_ids":
        [
            "845254682",
            "831189092"
        ]
    },
    "5e74c911-0b63-4b84-8ad4-77dd9bed7b53":
    {
        "legacy_id": 1599707069,
        "w_ids":
        [
            "1032024432"
        ]
    },
    "7b988890-20ff-4279-94df-198369a58848":
    {
        "legacy_id": 1601097861,
        "w_ids":
        [
            "1032024432"
        ]
    }
}

Me gustaría convertir esto en una ARRAY con el siguiente formato:

[
    {"new_id"="455a9410-29a8-48a3-ad22-345afa3cd295","legacy_id"=1599677886,"w_ids"=["845254682","831189092"]},
    {"new_id"="5e74c911-0b63-4b84-8ad4-77dd9bed7b53","legacy_id"=1599707069,"w_ids"=["1032024432"]},
    {"new_id"="7b988890-20ff-4279-94df-198369a58848","legacy_id"=1601097861,"w_ids"=["1032024432"]}
]

Ya pude extraer legacy_id y w_ids con la siguiente consulta, pero tengo dificultades para agregar la clave original como valor:

 with example_data as
 (
     select * from (
        VALUES('{    "455a9410-29a8-48a3-ad22-345afa3cd295":    {        "legacy_id": 1599677886,        "w_ids":        [            "845254682",            "831189092"        ]    },    "5e74c911-0b63-4b84-8ad4-77dd9bed7b53":    {        "legacy_id": 1599707069,        "w_ids":        [            "1032024432"        ]    },    "7b988890-20ff-4279-94df-198369a58848":    {        "legacy_id": 1601097861,        "w_ids":        [            "1032024432"        ]    }}')
     ) as t(col)
 )
select *
,transform(map_values(cast(json_parse(col) AS map(varchar, json))),entry -> MAP_FROM_ENTRIES(ARRAY[('legacy_id',json_extract(entry,'$.legacy_id')),('w_ids',json_extract(entry,'$.w_ids'))]))
from example_data;
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para agregar la clave original como valor, puede modificar la declaración existente de la siguiente manera:

    con ejemplo_datos as
    (
        select * from (
            VALUES('{    "455a9410-29a8-48a3-ad22-345afa3cd295":    {        "legacy_id": 1599677886,        "w_ids":        [            "845254682",            "831189092"        ]    },    "5e74c911-0b63-4b84-8ad4-77dd9bed7b53":    {        "legacy_id": 1599707069,        "w_ids":        [            "1032024432"        ]    },    "7b988890-20ff-4279-94df-198369a58848":    {        "legacy_id": 1601097861,        "w_ids":        [            "1032024432"        ]    }}')
        ) as t(col)
    )
    select transform(map_entries(cast(json_parse(col) as map(varchar, json))), key, value ->
            map_concat(value, map('new_id', key))
        )
    from ejemplo_datos;
    

    Esta declaración primero transforma la columna de entrada col en un mapa JSON, donde las claves son las claves originales de la entrada y los valores son los correspondientes objetos JSON. Luego utiliza map_entries para extraer los pares clave-valor de ese mapa y, para cada par, aplica una operación map_concat que agrega un nuevo par clave-valor con la clave original como clave y el valor es el objeto JSON original más la nueva clave new_id con el valor de la clave original. La salida resultante es un solo objeto JSON que combina todos los objetos transformados en el mapa de entrada en uno solo.

Comments are closed.