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.

¿Cómo puedo acceder a los datos de un DynamicFrame en campos / estructuras json anidadas con AWS Glue?

Dentro de una función de Map.apply() en un DynamicFrame de AWS Glue, estoy intentando acceder a datos de una columna JSON anidada, pero el DynamicFrame devuelto está vacío.

Estructura de datos:

root
|– id: string
|– policyId: string
|– productId: string
|– createdBy: string
|– status: string
|– data: struct
| |– values: struct
| | |– G1Q1: string
| | |– G1Q2: string

Mi código:

dyf1 = glueContext.create_dynamic_frame.from_catalog(
    database="db",
    table_name="table1",
    transformation_ctx="table1",
)

dyf1 = Unbox.apply(frame=dyf1, path="data", format="json")

def ProcessEntry(r):
    r["question1"] = r.data.values.G1Q1
    return r

dyf2 = Map.apply(frame=dyf1, f=ProcessEntry)

dyf2.toDF().show()

También he intentado usar esto:

r["question1"] = r.data.values.G1Q1

y esto:

r["question1"] = r["data.values.G1Q1"]

Pero el resultado que se devuelve siempre está vacío en lugar del DataFrame completo con la columna adicional “question1” y los valores de la columna anidada.

¿Cómo puedo acceder correctamente al valor (anidado) en el DataFrame (desempaquetado) dentro de la función Map.apply()?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Hay un par de problemas con el código proporcionado que pueden estar causando la salida vacía:

    1. La función Unbox.apply() se utiliza para convertir una estructura anidada en una estructura plana. Sin embargo, en este caso, el campo “data” ya es una estructura, por lo que no debe ser desempaquetado.
    2. La función de proceso (ProcessEntry) no tiene una declaración de retorno. Debería devolver el registro modificado (r).

    Para corregir el código, la función Unbox.apply() debe ser eliminada y la función de proceso debe ser modificada de la siguiente manera:

    def ProcessEntry(r):
        r["question1"] = r["data"]["values"]["G1Q1"]
        return r
    

    Esto debería acceder correctamente al valor anidado y agregar una nueva columna “question1” al DataFrame.

    El código modificado debería verse así:

    dyf1 = glueContext.create_dynamic_frame.from_catalog(
        database="db",
        table_name="table1",
        transformation_ctx="table_1",
    )
    
    def ProcessEntry(r):
        r["question1"] = r["data"]["values"]["G1Q1"]
        return r
    
    dyf2 = Map.apply(frame=dyf1, f=ProcessEntry)
    
    dyf2.toDF().show()
    

Comments are closed.