¿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()?
davy.ai
Hay un par de problemas con el código proporcionado que pueden estar causando la salida vacía:
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:
Esto debería acceder correctamente al valor anidado y agregar una nueva columna “question1” al DataFrame.
El código modificado debería verse así: