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 leer un archivo Parquet desde S3 usando boto3.

Tengo varios archivos Parquet en un cubo de S3 (s3://mybucket/my/path/). Quiero leerlos en un dataframe de Spark utilizando Boto3.

No puedo leerlos directamente con spark.read.parquet(‘s3://mybucket/my/path/’) debido a la seguridad existente. Por lo tanto, necesito leerlos utilizando Boto3.

Al intentar leer un archivo Parquet individual (s3://mybucket/my/path/myfile1.parquet) con el siguiente código, obtengo un error.

res = autorefresh_session.resource(‘s3’)
bucket = res.Bucket(name=mybucket)
obj = bucket.objects.filter(prefix=/my/path)
body = io.BytesIO(obj.get()[‘Body’].read())
spark.read.parquet(body).show()

Py4JJavaError: Se produjo un error al llamar a xyz.parquet.
java.lang.ClassCastException: java.util.ArrayList no se puede convertir a java.lang.String
en org.apache.spark.sql.DataFrameReader.preprocessDeltaLoading(DataFrameReader.scala:282)

¿Alguien puede indicarme cómo puedo leer un solo archivo y una carpeta completa utilizando Boto3?

Puedo leer archivos CSV con éxito utilizando el enfoque anterior, pero no archivos Parquet.
Puedo leer un solo archivo en un dataframe de Pandas y luego en Spark, pero este no será un método eficiente de lectura.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para leer un solo archivo parquet usando boto3 se puede usar el siguiente código:

    res = autorefresh_session.resource('s3')
    bucket = res.Bucket(name=mybucket)
    obj = bucket.Object(key='my/path/myfile1.parquet')
    body = io.BytesIO(obj.get()['Body'].read())
    spark.read.parquet(body).show()
    

    Para leer una carpeta entera de archivos parquet, se puede usar el siguiente código:

    res = autorefresh_session.resource('s3')
    bucket = res.Bucket(name=mybucket)
    objects = bucket.objects.filter(Prefix='my/path/')
    for obj in objects:
        body = io.BytesIO(obj.get()['Body'].read())
        spark.read.parquet(body).show()
    

Comments are closed.