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 cargar datos de relación padre-hijo utilizando AWS Glue

Soy nuevo en AWS Glue y quería saber la manera estándar de cargar datos padre-hijo desde un archivo JSON en un cubo S3 a RDS (MySQL). Supongamos que tenemos dos tablas en MySQL: ‘user’ y ‘user_contact’. La tabla ‘user’ tiene las columnas: id (entero) pk, valores generados automáticamente, nombre (varchar). Y la tabla ‘user_contact’ tiene las columnas: id (entero) pk, valores generados automáticamente, user_id (FK), dirección (varchar). Y tenemos dos archivos JSON correspondientes en S3: user.json:

[
{
“user_name”: “u1”
},
{
“user_name”: “u2”
},
{
“user_name”: “u3”
}
]

y user_contact.json:
[
{
“user_name”: “u1”,
“address”: “adr1”
},
{
“user_name”: “u2”,
“address”: “adr2”
},
{
“user_name”: “u3”,
“address”: “adr3”
}
]

Quiero crear el trabajo de AWS Glue para cargar los datos de user.json a la tabla ‘user’ y también cargar user_contact.json en la tabla ‘user_contact’. He creado rastreadores para generar la tabla de origen y destino en el catálogo de Glue, y las tablas se ven bien. Pero aún no entiendo cómo cargar los datos usando DynamicFrame a través del script del trabajo. Por ejemplo, cómo insertar los valores de PK de la tabla ‘user’ en los valores de FK de la tabla ‘user_contact’ de manera dinámica fue mi principal obstáculo. Por favor, indíqueme el pseudocódigo del trabajo (los pasos críticos para la transformación).

Finalmente, el trabajo poblara los datos en las tablas de la siguiente manera:

user

#id #name

1 u1

2 u2

3 u3

user_contact

#id #user_id #address

1 1 adr1

2 2 adr2

3 3 adr3

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para cargar datos padre-hijo desde JSON en un cubo de S3 a tablas de RDS (MySQL), siga los pasos a continuación:

    1. Cree un script de trabajo de Glue utilizando la consola de AWS Glue o con un IDE como PyCharm.
    2. Importe las bibliotecas necesarias como boto3, awsglue y pyspark.

    3. Cree un DynamicFrame para cada archivo JSON utilizando el siguiente código:

      user_dyf = glueContext.create_dynamic_frame_from_options("s3", {"path": "s3://nombre-del-cubo/user.json", "recurse":True, "fileType":"json"})

    4. Mapee las columnas del archivo JSON con las columnas de la tabla RDS utilizando el siguiente código:

      user_mapping = [("id", "id", "int"),("user_name", "nombre", "string")]

    5. Utilice la transformación apply_mapping para mapear el esquema de origen al esquema de destino:

      user_transformed = apply_mapping(user_dyf, user_mapping)

    6. Reemplace la tabla de usuario existente con los datos transformados utilizando el siguiente código:

      glueContext.write_dynamic_frame.from_jdbc_conf(user_transformed, connection_options, "user", "overwrite")

    7. Para la tabla user_contact, debe crear una relación de clave externa con la tabla de usuario. Puede utilizar la transformación join para unir los datos de usuario y user_contact según el nombre de usuario:

      user_contact_join = Join.apply(user_transformed, user_contact_dyf, 'user_name', 'user_name')

    8. Mapee las columnas de los datos unidos con las columnas de la tabla user_contact utilizando el siguiente código:

      user_contact_mapping = [("id", "id", "int"),("user_id", "id", "int"),("address", "dirección", "string")]

    9. Utilice la transformación apply_mapping para mapear el esquema de origen al esquema de destino:

      user_contact_transformed = apply_mapping(user_contact_join, user_contact_mapping)

    10. Reemplace la tabla de user_contact existente con los datos transformados utilizando el siguiente código:

      glueContext.write_dynamic_frame.from_jdbc_conf(user_contact_transformed, connection_options, "user_contact", "overwrite")

    11. Ejecute el trabajo de Glue para cargar los datos en las tablas de RDS.

    Nota: La clave primaria (id) en la tabla de usuario se genera automáticamente, por lo que no es necesario insertarla manualmente. La clave externa (user_id) en la tabla de user_contact se llenará dinámicamente en función de la unión y la transformación de mapeo.

Comments are closed.