如何使用Boto3来遍历 AWS Glue 中存在的 S3 存储桶中的所有对象

如何使用Boto3来遍历 AWS Glue 中存在的 S3 存储桶中的所有对象

AWS Glue是一个完全托管的数据集成服务,用于使数据准备和加载变得更加容易和便捷。AmazonS3存储桶是一个非常受欢迎的存储提供程序,经常用于存储各种类型的数据,包括图像,音频和视频文件。

在AWS Glue中,可以使用Python编写ETL作业。其中,Python客户端库Boto3提供了很多功能,可以用来实现与AWS资源的交互。在这篇文章中,我们将会学习如何使用Boto3来遍历在AWS Glue中存在的S3存储桶中的所有对象。

阅读更多:Python 教程

准备工作

在开始本文的实现步骤之前,您需要满足以下几个前提条件:

  • 拥有一个AWS账户
  • 已经创建了一个AWS Glue Job,并将Python脚本上传到了AWS S3存储桶中
  • 拥有一个AWS S3存储桶

前提条件都准备好后,我们开始编写 Python 代码。

编写Python代码

首先,您需要导入AWS Python SDK的Boto3库。在Python代码中,只需要运行以下命令。

import boto3

导入Boto3库后,我们需要在Amazon S3中指定bucket_name和prefix。

s3 = boto3.client('s3')
bucket_name = '<your_bucket_name>'
prefix = '<your_prefix: (optional)>'

接下来,我们就可以使用list_objects_v2()方法来获取存储桶中所有对象的清单。请参见以下示例代码:

def get_matching_s3_objects(bucket, prefix="", suffix=""):
    """
    Generate objects in an S3 bucket.

    :param bucket: Name of the S3 bucket.
    :param prefix: Only fetch objects whose key starts with
        this prefix (optional).
    :param suffix: Only fetch objects whose keys end with
        this suffix (optional).
    """
    kwargs = {'Bucket': bucket}
    if isinstance(prefix, str):
        kwargs['Prefix'] = prefix
    while True:
        resp = s3.list_objects_v2(**kwargs)
        for obj in resp['Contents']:
            key = obj['Key']
            if key.startswith(prefix) and key.endswith(suffix):
                yield obj
        try:
            kwargs['ContinuationToken'] = resp['NextContinuationToken']
        except KeyError:
            break

接下来,我们可以遍历存储桶中的所有对象。

for obj in get_matching_s3_objects(bucket_name, prefix):
    s3.download_file(bucket_name, obj['Key'], '<local_file_path>')

以上代码会下载所有文件到指定路径。如果存储桶中文件过多,建议使用AWS S3的流式下载。

流式下载S3对象

如果存储桶中的文件过多,遍历所有的对象,并下载到本地存储,可能会导致内存不足的问题。因此,我们可以使用AWS S3的分段下载机制,以流式方式下载和处理S3对象。

下面的代码演示了如何使用stream方式来下载S3对象,并进行数据处理。

def select_key(obj):
    return obj.key


bucket = s3.Bucket(bucket_name)
keys = [select_key(obj) for obj in bucket.objects.filter(Prefix=prefix)]

s3objs = bucket.objects.filter(Prefix=prefix)
for i, obj in enumerate(s3objs):
    obj = s3.Object(obj.bucket_name, obj.key)
    with io.BytesIO(obj.get()["Body"].read()) as file:
        file.seek(0)
        # 处理下载的对象

结论

在本文中,我们已经学习了如何使用AWS Glue和Boto3库,遍历存储在AWS S3存储桶中的所有对象。我们已经看到了如何使用stream方式下载S3对象,并进行数据处理。学习本文将使您更好地了解AWS数据处理和Boto3库的使用,为您的AWS项目开发提供了非常有价值的知识。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程