将CSV文件从s3加载到Pandas并使用chunksize。

4

我正在尝试使用s3从一个非常大的文件中读取数据...

import pandas as pd
import s3fs
df = pd.read_csv('s3://bucket-name/filename', chunksize=100000)

即使给出块大小,它仍然需要很长时间。当从S3获取文件时,chunksize选项是否有效?如果无效,则有没有更好的方式在S3中加载大文件?


1
这个有帮助吗?链接 - jellycsc
是的,我认为Dask是一个不错的选择。 - Xion
1个回答

4

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_csv.html 明确指出

filepath_or_bufferstr,path object或file-like object。任何有效的字符串路径都可以接受。该字符串可以是URL。有效的URL方案包括http、ftp、s3、gs和file。对于文件URL,期望有主机名。本地文件可以是:file://localhost/path/to/table.csv。

如果你想传递一个路径对象,pandas接受任何os.PathLike。

通过文件类对象,我们指的是具有read()方法的对象,例如文件句柄(例如通过内置的open函数)或StringIO。

当读取分块时,pandas会返回一个迭代器对象,您需要遍历它。例如:

for df in pd.read_csv('s3://<<bucket-name>>/<<filename>>',chunksize = 100000):
    process df chunk..

如果你认为是因为块大小较大,可以考虑仅对第一个块进行尝试,使用小的块大小,例如:

for df in pd.read_csv('s3://<<bucket-name>>/<<filename>>',chunksize = 1000):
    print(df.head())
    break

2
这个答案对我很有帮助。我编写了一个函数,通过它我知道 Athena 查询结果在 S3 存储中的桶和键。随后,我按块处理大量的 Athena 查询结果 csv 文件:def process_result_s3_chunks(bucket, key, chunksize): csv_obj = s3.get_object(Bucket=bucket, Key=key) body = csv_obj['Body'] for df in pd.read_csv(body, chunksize=chunksize): process(df) - nom-mon-ir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接