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.

Importación de datos desde MongoDB: columnas duplicadas.

Estoy intentando importar datos de MongoDB a un trabajo de AWS Glue y luego a Redshift, pero al realizar la carga desde MongoDB obtengo esta extraña excepción, ¿hay alguna manera de solucionar este problema?


AnálisisException: Se encontraron columnas duplicadas en el esquema de datos: column1, column2, column3

Después de buscar en Google, dice que si el documento contiene una columna duplicada en cualquier lugar del esquema, fallará. ¿Alguna pista de cómo manejar esto?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, el mensaje de error indica que hay columnas duplicadas en el esquema de datos, lo que puede provocar un fallo en la carga desde MongoDB.

    Para solucionar este problema, un enfoque es especificar una proyección en el conector de MongoDB para el trabajo de Glue, para excluir las columnas duplicadas del esquema de datos.

    Por ejemplo, si las columnas duplicadas son columna2 y columna3, se puede modificar el script del trabajo de Glue para incluir la siguiente proyección:

    # Importando las librerías necesarias.
    from awsglue.dynamicframe import DynamicFrame
    
    # Creando un marco dinámico a partir de la fuente de datos de MongoDB.
    mongo_dynamic_frame = glueContext.create_dynamic_frame.from_options(
         "mongodb",
         connection_options = {
             "uri": "mongodb://<your_mongodb_connection_uri>",
             "database": "<your_mongodb_database>",
             "collection": "<your_mongodb_collection>",
             # Se especifica una proyección para excluir las columnas duplicadas.
             "projection": '{ "columna1": 1, "columna2": 0, "columna3": 0 }'
         }
    )
    
    # Convirtiendo el esquema dinámico de MongoDB en el esquema de Redshift.
    redshift_dynamic_frame = DynamicFrame.from_options(
        frame = mongo_dynamic_frame,
        connection_type = "redshift",
        connection_options = {
            "preactions": [
                "<your_redshift_preactions_query>"
            ],
            "database": "<your_redshift_database>",
            "table_name": "<your_redshift_table>",
            "aws_iam_role": "<your_redshift_iam_role>",
            "tempdir": "s3://<your_s3_temp_bucket>/" # se especifica el bucket de S3 para los archivos temporales.
        },
        format = "redshift",
        transformation_ctx = "redshift_dynamic_frame"
    )
    

    En el fragmento de código anterior, se utiliza el parámetro projection para especificar las columnas que se incluirán o excluirán del esquema de datos. En este caso, se excluyen las columnas duplicadas de la proyección, utilizando columna2: 0 y columna3: 0.

    De esta manera, el trabajo de Glue debería poder cargar los datos desde MongoDB sin encontrar el error de columnas duplicadas.

Comments are closed.