如何使用pyarrow从S3中读取拼花文件列表作为熊猫数据框?

迭戈·莫拉·塞斯佩德斯:

我使用boto3(1.4.4),pyarrow(0.4.1)和pandas(0.20.3)实现了这一目标。

首先,我可以像这样在本地读取一个实木复合地板文件:

import pyarrow.parquet as pq

path = 'parquet/part-r-00000-1e638be4-e31f-498a-a359-47d017a0059c.gz.parquet'
table = pq.read_table(path)
df = table.to_pandas()

我还可以像这样在本地读取实木复合地板文件的目录:

import pyarrow.parquet as pq

dataset = pq.ParquetDataset('parquet/')
table = dataset.read()
df = table.to_pandas()

两者都像魅力。现在,我想使用存储在S3存储桶中的文件远程实现相同的目的。我希望这样的事情可以工作:

dataset = pq.ParquetDataset('s3n://dsn/to/my/bucket')

但这不是:

OSError: Passed non-file path: s3n://dsn/to/my/bucket

仔细阅读pyarrow的文档后,目前看来这是不可能因此,我提出了以下解决方案:

从S3读取单个文件并获取熊猫数据框:

import io
import boto3
import pyarrow.parquet as pq

buffer = io.BytesIO()
s3 = boto3.resource('s3')
s3_object = s3.Object('bucket-name', 'key/to/parquet/file.gz.parquet')
s3_object.download_fileobj(buffer)
table = pq.read_table(buffer)
df = table.to_pandas()

在这里,我还没有经过优化的骇人解决方案,可以从S3文件夹路径创建熊猫数据框:

import io
import boto3
import pandas as pd
import pyarrow.parquet as pq

bucket_name = 'bucket-name'
def download_s3_parquet_file(s3, bucket, key):
    buffer = io.BytesIO()
    s3.Object(bucket, key).download_fileobj(buffer)
    return buffer

client = boto3.client('s3')
s3 = boto3.resource('s3')
objects_dict = client.list_objects_v2(Bucket=bucket_name, Prefix='my/folder/prefix')
s3_keys = [item['Key'] for item in objects_dict['Contents'] if item['Key'].endswith('.parquet')]
buffers = [download_s3_parquet_file(s3, bucket_name, key) for key in s3_keys]
dfs = [pq.read_table(buffer).to_pandas() for buffer in buffers]
df = pd.concat(dfs, ignore_index=True)

有没有更好的方法来实现这一目标?也许某种使用pyarrow的熊猫连接器?我想避免使用pyspark,但是如果没有其他解决方案,那么我会接受。

领域:

您应该使用yjk21s3fs建议模块但是,由于调用ParquetDataset的结果,您将获得pyarrow.parquet.ParquetDataset对象。要获取Pandas DataFrame,您宁愿将其应用于.read_pandas().to_pandas()

import pyarrow.parquet as pq
import s3fs
s3 = s3fs.S3FileSystem()

pandas_dataframe = pq.ParquetDataset('s3://your-bucket/', filesystem=s3).read_pandas().to_pandas()

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用pyarrow从s3中读取分区的实木复合地板文件?

使用pyarrow对熊猫数据框进行分区并另存为拼花文件时,不会保留数据类型

如何从json文件中读取键值对作为熊猫数据框?

从AWS S3存储读取数据拼花

如何在python中使用pyarrow从S3读取分区实木复合地板文件

记录由pyarrow在S3上创建的拼花地板文件名

如何在Spark数据框中从AWS S3读取多个文件?

将文件从私有S3存储桶读取到熊猫数据框

如何使用S3中的数据框访问多个json文件

如何在熊猫数据框中使用列表作为值?

使用列表作为熊猫数据框中的值

从S3读取CSV文件到Spark数据框中是否期望如此之慢?

使用Pyarrow压缩/合并拼花地板文件?

如何从泡菜文件列表中创建多个熊猫数据框?

使用AWS Boto将文件从CSV转换为S3上的拼花地板

如何从S3读取单个实木复合地板文件到dask数据帧中?

如何读取亚马逊S3中文件的元数据

如何在 S3 中读取经过训练的数据文件

如何将多个CSV文件从文件夹读取到以数据框名称作为文件名的熊猫中

如何使用Python在myBucket中上传CSV文件并在S3 AWS中读取文件

如何从BufferedReader中S3中读取文件?

如何限制Sparklyr中的拼花文件读取的行数

如何从Scala的Glue Job中的S3文件创建动态数据框?

如何在Python中从S3读取Avro文件?

如何在EMR中从s3读取文件?

如何在S3中读取ElasticSearch快照文件?

如何使用uproot从s3读取文件?

如何使用 mdfreader 从 AWS S3 读取 .dat 文件

如何使用列表迭代熊猫数据框