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 escribir un DataFrame de Pandas en un archivo Parquet?

Estoy leyendo datos en fragmentos usando pandas.read_sql y agregándolos a un archivo parquet, pero obtengo errores.

Usando pyarrow.parquet:

import pyarrow as pa
import pyarrow.parquet as pq
for chunk in pd.read_sql_query(query, conn, chunksize=10000):
    table_data = pa.Table.from_pandas(chunk)  # convirtiendo el df a arrow
    pq.write_table(table=table_data, where=file.parquet,
                   use_deprecated_int96_timestamps=True,
                   coerce_timestamps='ms', allow_truncated_timestamps=True)

Obteniendo el siguiente error:

File "pyarrow_parquet.pyx", line 1427, in pyarrow.parquet.ParquetWriter.__cinit__
File "pyarrow\error.pxi", line 120, in pyarrow.lib.check_status
pyarrow.lib.ArrowNotImplementedError: Tipo no manejado para la conversión de esquema de Arrow a Parquet: duration[ns]

Usando fastparquet:

from fastparquet import write
for chunk in pd.read_sql_query(query, conn, chunksize=10000):
    with open(os.path.join(download_location, file_name + '.parquet'), mode='a+') as f:
        write(filename=f.name, data=chunk, append=True)

Obteniendo el siguiente error:

raise ValueError("No se puede inferir el tipo de conversión de objeto: %s" % head)
ValueError: No se puede inferir el tipo de conversión de objeto: 0    2021-09-06

¿Hay alguna solución que convierta un dataframe de pandas a un archivo parquet (modo de agregado) sin problemas con las columnas de fecha y hora?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, existe una solución que convierte un dataframe de pandas a un archivo Parquet (modo de apéndice) sin problemas en las columnas de fecha y hora. Puede utilizar la biblioteca pyarrow y especificar el tipo de dato de la columna de fecha y hora de manera explícita de la siguiente manera:

    import pyarrow as pa
    import pyarrow.parquet as pq
    
    # Define el esquema con el tipo de dato explícito para la columna de fecha y hora
    esquema = pa.schema([
        ('columna1', pa.int64()),
        ('columna2', pa.string()),
        ('columna_fecha_hora', pa.timestamp('ms')),
        ('columna4', pa.float64()),
    ])
    
    # Abre el archivo Parquet en modo de apéndice
    with pq.ParquetWriter(file.parquet, schema=esquema, use_deprecated_int96_timestamps=True) as escritor:
        for trozo in pd.read_sql_query(consulta , conn, chunksize=10000):
            datos_tabla = pa.Table.from_pandas(trozo)  # convierte el dataframe en arrow
            escritor.write_table(datos_tabla)
    
    

    Al definir el esquema de manera explícita, puedes evitar cualquier problema con la columna de fecha y hora.

Comments are closed.