Saltar al contenido

Cómo escribir un archivo de parquet desde el marco de datos de pandas en S3 en python

No olvides que en las ciencias un problema casi siempre tiene varias soluciones, por lo tanto aquí mostraremos la mejor y más eficiente.

Solución:

Para su referencia, tengo el siguiente código que funciona.

s3_url = 's3://bucket/folder/bucket.parquet.gzip'
df.to_parquet(s3_url, compression='gzip')

Para usar to_parquetnecesitas pyarrow o fastparquet Para ser instalado. Además, asegúrese de tener la información correcta en su config y credentials archivos, ubicados en .aws carpeta.

Editar: Además, s3fs se necesita ver https://stackoverflow.com/a/54006942/1862909

podemos combinar pyarrow y boto3.

código de ejemplo rápido:

def main():
    data = 0: "data1": "value1"
    df = pd.DataFrame.from_dict(data, orient='index')
    write_pandas_parquet_to_s3(
        df, "bucket", "folder/test/file.parquet", ".tmp/file.parquet")


def write_pandas_parquet_to_s3(df, bucketName, keyName, fileName):
    # dummy dataframe
    table = pa.Table.from_pandas(df)
    pq.write_table(table, fileName)

    # upload to s3
    s3 = boto3.client("s3")
    BucketName = bucketName
    with open(fileName) as f:
       object_data = f.read()
       s3.put_object(Body=object_data, Bucket=BucketName, Key=keyName)

la siguiente función obtiene la salida del parquet en un búfer y luego escribe buffer.values() en S3 sin necesidad de guardar el parquet localmente

Además, dado que está creando un cliente s3, puede crear credenciales usando aws s3 keys que se puede almacenar localmente, en una conexión de flujo de aire o en el administrador de secretos de aws

def dataframe_to_s3(s3_client, input_datafame, bucket_name, filepath, format):

        if format == 'parquet':
            out_buffer = BytesIO()
            input_datafame.to_parquet(out_buffer, index=False)

        elif format == 'csv':
            out_buffer = StringIO()
            input_datafame.to_parquet(out_buffer, index=False)

        s3_client.put_object(Bucket=bucket_name, Key=filepath, Body=out_buffer.getvalue())

S3_client no es más que un objeto de cliente boto3. ¡Espero que esto ayude!

cortesía- https://stackoverflow.com/a/40615630/12036254

Acuérdate de que tienes concesión de añadir una estimación correcta .

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *