从 S3 将 CSV 数据加载到 Jupyter Notebook

Posted

技术标签:

【中文标题】从 S3 将 CSV 数据加载到 Jupyter Notebook【英文标题】:Load CSV data into Jupyter Notebook from S3 【发布时间】:2018-07-11 21:17:38 【问题描述】:

我在 Amazon Cloud 的 S3 存储桶中有多个 CSV 文件 (50 GB)。我正在尝试使用以下代码在 Jupyter Notebook(使用 Python3 内核)中读取这些文件:

import boto3
from boto3 import session
import pandas as pd

session = boto3.session.Session(region_name='XXXX')
s3client = session.client('s3', config = boto3.session.Config(signature_version='XXXX'))
response = s3client.get_object(Bucket='myBucket', Key='myKey')

names = ['id','origin','name']
dataset = pd.read_csv(response['Body'], names=names)
dataset.head() 

但我在运行代码时遇到以下错误:

valueError:文件路径或缓冲区对象类型无效:类'botocore.response.StreamingBody'

我遇到了这个 bug report 关于 pandas 和 boto3 对象还不兼容的问题。

我的问题是,我还能如何将这些 CSV 文件从我的 S3 存储桶导入到在云端运行的 Jupyter Notebook 中。

【问题讨论】:

【参考方案1】:

我将发布此修复程序来解决我的问题,以防有人需要。我用以下内容替换了 read_csv 行,问题就解决了:

dataset = pd.read_csv(io.BytesIO(response['Body'].read()), encoding='utf8')

【讨论】:

【参考方案2】:

您也可以使用 s3fs,它允许 pandas 直接从 S3 读取:

import s3fs

# csv file
df = pd.read_csv('s3://bucket_name/path_to_file')

# parquet file
df = pd.read_parquet('s3://bucket_name/path_to_file')

然后,如果您在一个存储桶中有多个文件,您可以像这样遍历它们:

import boto3
s3_resource = boto3.resource('s3')
bucket = s3_resource.Bucket(name='bucket_name')
for file in bucket.objects.all():
    # do what you want with the files
    # for example:
    if 'filter' in file.key:
        print(file.key)
        new_df = pd.read_csv('s3:://bucket_name/'.format(file.key))

【讨论】:

以上是关于从 S3 将 CSV 数据加载到 Jupyter Notebook的主要内容,如果未能解决你的问题,请参考以下文章

将大型 csv 文件从 S3 读入 R

数据摄取:将动态文件从 S3 加载到 Snowflake

Amazon Data Pipeline“将 S3 数据加载到 RDS MySQL”查询格式?

如何从 S3 存储桶中读取最后修改的 csv 文件?

将数据从aws s3导入mysql或任何非aws数据库

预计将解析从 S3 加载的雪花数据中的列时到达记录末尾