【问题标题】:Read parquet files from S3 bucket in a for loop在 for 循环中从 S3 存储桶读取镶木地板文件
【发布时间】:2022-11-06 00:57:06
【问题描述】:

我想在 for 循环中从 AWS S3 存储桶中读取镶木地板文件。

这是我的代码(不起作用):

session = boto3.Session(
                    aws_access_key_id=key,
                    aws_secret_access_key=secret,
                    region_name=region_name)
                    
s3 = session.resource('s3')

bucket = s3.Bucket(bucket_name)

for obj in bucket.objects.filter(Prefix=folder_path):

    response = obj.get()

    df = pd.read_parquet(response['Body'])
    
    # some data processing

它打印以下错误: ValueError: I/O operation on closed fileArrowInvalid: Called Open() on an uninitialized FileSource

我应该在这里解决什么问题?

【问题讨论】:

  • that doesn't work 是什么意思?
  • 它不读取文件。
  • 它是否给出任何具体错误?
  • 没什么...请注意,对于 CSV 文件,它确实有效。
  • 抱歉,现在我可以看到一个错误。它打印:ValueError: I/O operation on closed fileArrowInvalid: Called Open() on an uninitialized FileSource

标签: python pandas amazon-web-services amazon-s3 boto3


【解决方案1】:

pandas.read_parquet() 需要对要读取的文件的引用,而不是您提供的文件内容本身。

来自documentation

path : str,路径对象或类文件对象

字符串、路径对象(实现os.PathLike[str])或实现二进制read() 函数的类文件对象。该字符串可以是一个 URL。有效的 URL 方案包括 http、ftp、s3、gs 和文件。对于文件 URL,需要一个主机。本地文件可以是:file://localhost/path/to/table.parquet。文件 URL 也可以是包含多个分区 parquet 文件的目录的路径。 pyarrow 和 fastparquet 都支持目录路径和文件 URL。目录路径可以是:file://localhost/path/to/tabless3://bucket/partition_dir

如您所见,您可以提供一个 S3-url 作为路径,因此使其工作的最小侵入性更改可能是这样的:

for obj in bucket.objects.filter(Prefix=folder_path):
     obj_url = f"s3://{obj.bucket_name}/{obj.key}"
     df = pd.read_parquet(obj_url)

或者,“How to read a list of parquet files from S3 as a pandas dataframe using pyarrow?”列出了其他几个解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-22
    • 1970-01-01
    • 1970-01-01
    • 2019-12-07
    • 2015-11-20
    • 2021-10-11
    相关资源
    最近更新 更多