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.

Inserte un gran dataframe en una tabla Hadoop utilizando Python.

Tengo un gran marco de datos df para el cual se adjuntó la imagen de muestra a continuación. Contiene 47.000 filas que quiero insertar en una tabla Hadoop. La tabla en la que quiero insertar estos datos tiene todas las columnas string.. Todas las columnas en el marco de datos de pandas tienen un tipo de datos object.

keyword,category_l1,category_l2,brand,ordercode,sku,snp_subclass,date

Df

He intentado usar la siguiente solución de cursor para la cual estoy obteniendo un error.
Además, estoy buscando un enfoque más rápido que usar el cursor.
He intentado la siguiente solución

with pyodbc.connect("DSN=hadoop",autocommit=True) as conx:
    cursor = conx.cursor()
    cursor.executemany("INSERT INTO ast_labs_t.dcs_search_keywords_nlp_results_test (keyword,category_l1,category_l2,brand,ordercode,sku,snp_subclass) VALUES(?,?,?,?,?,?,?)", df)

Estoy obteniendo el siguiente error:

La consulta SQL contiene 0 marcadores de parámetros, pero se suministraron 7 parámetros', 'HY000')
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El error está ocurriendo porque el método executemany() está intentando dar formato a la consulta SQL con parámetros, pero no puede encontrar marcadores de parámetros en la cadena de consulta.

    Para solucionar este error, debes agregar marcadores de parámetros en la cadena de consulta SQL para cada columna en la tabla. Como todas las columnas en el marco de datos de pandas tienen un tipo de objeto, puedes usar el marcador de parámetros %s para todas las columnas.

    Aquí está el código actualizado:

    with pyodbc.connect("DSN=hadoop", autocommit=True) as conx:
        cursor = conx.cursor()
        query = "INSERT INTO ast_labs_t.dcs_search_keywords_nlp_results_test (keyword,category_l1,category_l2,brand,ordercode,sku,snp_subclass) VALUES (?, ?, ?, ?, ?, ?, ?)"
        values = df.values.tolist()
        cursor.executemany(query, values)
    

    Este código insertará todas las filas en el marco de datos de pandas df en la tabla de Hadoop ast_labs_t.dcs_search_keywords_nlp_results_test. La variable values se crea convirtiendo el marco de datos de pandas en una lista de listas usando el método .values.tolist().

    En cuanto a un enfoque más rápido que usar un cursor, podrías usar Apache Spark para escribir el marco de datos de pandas en Hadoop. Spark tiene soporte integrado para leer y escribir datos en Hadoop utilizando la API Hadoop Distributed File System (HDFS).

    Aquí hay un ejemplo de cómo podrías usar Spark para escribir el marco de datos de pandas en Hadoop:

    from pyspark.sql import SparkSession
    
    spark = SparkSession.builder.appName("PandasToHadoop").getOrCreate()
    
    df_spark = spark.createDataFrame(df)
    df_spark.write.format("jdbc").options(
        url="jdbc:hive2://<hiveserver2_ip>:10000/<database_name>",
        driver="org.apache.hive.jdbc.HiveDriver",
        dbtable="ast_labs_t.dcs_search_keywords_nlp_results_test",
        user="your_username",
        password="your_password").mode("append").save()
    

    Este código lee el marco de datos de pandas df en un DataFrame de Spark llamado df_spark, luego usa la API JDBC de Spark para escribir el DataFrame en la tabla de Hadoop deseada en Hive. El parámetro mode("append") agrega los datos a la tabla existente si ya existe, de lo contrario, crea una nueva tabla.

    Usar Apache Spark puede ser más rápido que usar un cursor porque Spark puede paralelizar el proceso de escritura de datos en múltiples nodos en un clúster. Sin embargo, viene con una sobrecarga adicional de configuración y configuración, por lo que puede que no valga la pena para conjuntos de datos pequeños o casos de uso únicos.

Comments are closed.