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_parquet
necesitas 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 .