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.

Leer muchos archivos Parquet desde S3 a un marco de datos de pandas.

He estado investigando sobre este tema durante algunos días y todavía no he encontrado una solución efectiva. Disculpen si esta pregunta es repetitiva (aunque he revisado preguntas similares y no he encontrado la solución adecuada).

Tengo un bucket de s3 con alrededor de 150 archivos parquet. He estado buscando una manera dinámica de importar todos estos archivos en un solo dataframe (pueden ser múltiples, si es más eficiente computacionalmente). Si todos estos parquets se agregaran a un solo dataframe, sería una cantidad muy grande de datos, así que si la solución a esto es simplemente que requiero más potencia de computación, por favor háganmelo saber. En última instancia, me encontré con awswrangler y estoy usando el siguiente código, que se ha estado ejecutando como se esperaba:

df = wr.s3.read_parquets (path = & quot; s3: //my-s3-data/folder1/subfolder1/subfolder2/”, dataset = True, columns = df_cols, chunked = True)

Este código ha estado devolviendo un objeto generador, del cual no estoy seguro de cómo convertirlo a un dataframe. He intentado soluciones de las páginas vinculadas (abajo) y he obtenido varios errores como ruta de archivo no válida y desajuste de longitud.

https://newbedev.com/create-a-pandas-dataframe-from-generator

https://aws-data-wrangler.readthedocs.io/en/stable/stubs/awswrangler.s3.read_parquet.html

https://stackoverflow.com/questions/18915941/create-a-pandas-dataframe-from-generator

Otra solución que intenté fue de https://www.py4u.net/discuss/140245:

import s3fs
import pyarrow.parquet as pq

fs = s3fs.S3FileSystem ()
bucket = & quot; cortex-grm-pdm-auto-design-data & quot;
path = & quot; s3: //my-bucket/folder1/subfolder1/subfolder2/”

Python 3.6 o posterior

p_dataset = pq.ParquetDataset (
f & quot; s3: //my-bucket/folder1/subfolder1/subfolder2/&quot ; ,
sistema de archivos = fs
)
df = p_dataset.read (). to_pandas ()

lo que resultó en un error & quot;’AioClientCreator’ object has no attribute ‘registerlazyblockunknownfipspseudo_regions” & quot;

Por último, también intenté la solución de múltiples parquets de https://newbedev.com/how-to-read-a-list-of-parquet-files-from-s3-as-a-pandas-dataframe-using-pyarrow:

Leer varios parquets de una carpeta en S3 generada por spark

def pd_read_s3_multiple_parquets (ruta de archivo, bucket, s3 = None,
s3_client = None, verbose = False, ** args):
if not filepath.endswith (& # 39; / & # 39 ;):
filepath = filepath + & # 39; / & # 39; # Agregar & # 39; / & # 39; al final
if s3_client es None:
s3_client = boto3.client (& # 39; s3 & # 39;)
if s3 es None:
s3 = boto3.resource (& # 39; s3 & # 39;)
s3_keys = [item.key para elemento en s3.Bucket(bucket).objects.filter(Prefix=filepath)
if item.key.endswith (& # 39;. parquet & # 39;)]
if not s3_keys:
print (& # 39; No se encontró parquet en & # 39 ;, bucket, filepath)
elif verbose:
print (& # 39; Cargar parquets: & # 39;)
para p en s3_keys:
print (p)
dfs = [pd_read_s3_parquet(key, bucket=bucket, s3_client=s3_client, **args)
for key in s3_keys]
return pd.concat(dfs, ignore_index=True)

df = pd_read_s3_multiple_parquets (& # 39; ruta / a / carpeta & # 39 ;, & # 39; mi_bucket & # 39;)

Este devolvió que no se encontraron parquets en la ruta (que estoy seguro de que es falso, los parquets están allí cuando visito el s3 real), así como el error & quot; no hay objetos para concatenar & quot;

¡Cualquier orientación que puedan brindar es muy apreciada! De nuevo, disculpen cualquier repetición en mi pregunta. Gracias de antemano.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que has intentado diferentes enfoques para leer los archivos parquet desde tu bucket S3 en un dataframe. Desafortunadamente, parece que te has encontrado con algunos errores.

    Un enfoque que podrías intentar es utilizar la función pandas.read_parquet. Esta función te permite leer un archivo parquet individual o una lista de archivos parquet de un directorio. También puedes especificar las columnas que deseas leer.

    Otro enfoque que podrías intentar es utilizar la clase pyarrow.parquet.ParquetDataset. Esta clase te permite leer múltiples archivos parquet de un directorio y luego convertirlos en un solo dataframe.

    ¡Espero que esto te ayude!

Comments are closed.