Computer >> Máy Tính >  >> Lập trình >> Python

Cách sử dụng Boto3 để phân trang thông qua các đối tượng tải lên nhiều phần của nhóm S3 có trong AWS Glue

Tuyên bố sự cố: Sử dụng boto3 thư viện bằng Python để phân trang thông qua các đối tượng tải lên nhiều phần của nhóm S3 từ Danh mục dữ liệu AWS Glue được tạo trong tài khoản của bạn

Phương pháp tiếp cận / Thuật toán để giải quyết vấn đề này

  • Bước 1: Nhập boto3 botocore các ngoại lệ để xử lý các ngoại lệ.

  • Bước 2: prefix_name, max_items , page_size started_token là tham số tùy chọn cho chức năng này trong khi bucket_name là tham số bắt buộc.

    • Prefix_name là các thư mục con cụ thể mà người dùng muốn phân trang qua

    • max_items biểu thị tổng số bản ghi cần trả về. Nếu số lượng bản ghi có sẵn> max_items , sau đó là NextToken sẽ được cung cấp trong câu trả lời để tiếp tục phân trang.

    • page_size biểu thị kích thước của mỗi trang.

  • started_token giúp phân trang và nó sử dụng Marker từ phản hồi trước đó.

  • Bước 3: Tạo phiên AWS bằng boto3 lib . Đảm bảo rằng region_name được đề cập trong hồ sơ mặc định. Nếu nó không được đề cập, thì hãy chuyển region_name một cách rõ ràng trong khi tạo phiên.

  • Bước 4: Tạo ứng dụng AWS cho S3.

  • Bước 5: Tạo bộ phân trang đối tượng chứa thông tin chi tiết về các phiên bản đối tượng của nhóm S3 bằng cách sử dụng list_multipart_uploads .

  • Bước 6: Gọi hàm phân trang và chuyển max_items , page_size started_token dưới dạng PaginationConfig tham số trong khi bucket_name dưới dạng tham số Nhóm và prefix_name làm Tiền tố.

  • Bước 7: Nó trả về số lượng bản ghi dựa trên max_size page_size .

  • Bước 8: Xử lý ngoại lệ chung nếu có sự cố trong khi phân trang.

Mã mẫu

Sử dụng mã sau để phân trang thông qua tải lên nhiều phần của nhóm S3 được tạo trong tài khoản người dùng -

import boto3
from botocore.exceptions import ClientError

def paginate_through_multipart_upload_s3_bucket(bucket_name, prefix_name=None, max_items=None:int,page_size=None:int, starting_token=None:string):
   session = boto3.session.Session()
   s3_client = session.client('s3')
   try:
   paginator = s3_client.get_paginator('list_objects')
      response = paginator.paginate(Bucket=bucket_name, Prefix=prefix_name,   PaginationConfig={
         'MaxItems':max_items,
         'PageSize':page_size,
         'StartingToken':starting_token}
      )
   return response
   except ClientError as e:
      raise Exception("boto3 client error in paginate_through_multipart_upload_s3_bucket: " + e.__str__())
   except Exception as e:
      raise Exception("Unexpected error in paginate_through_multipart_upload_s3_bucket: " + e.__str__())

a = paginate_through_multipart_upload_s3_bucket('s3-test-bucket', 'testfolder',2,5)
print(*a)

Đầu ra

{'ResponseMetadata': {'RequestId': 'YA9CGTAAX', 'HostId': '8dqJW******************', 'HTTPStatusCode': 200, 'HTTPHeaders': {'x-amz-id-2': '8dqJW*********************, 'x-amz-request-id': 'YA9CGTAAX', 'date': 'Sat, 03 Apr 2021 08:16:05 GMT', 'content-type': 'application/xml', 'transfer-encoding': 'chunked', 'server': 'AmazonS3'}, 'RetryAttempts': 0}, 'Bucket': 's3-test-bucket', 'KeyMarker': '', 'UploadIdMarker': '', 'NextKeyMarker': '', 'Prefix': 'testfolder', 'NextUploadIdMarker': '', 'MaxUploads': 5, 'IsTruncated': False, 'Uploads': [
{'UploadId': 'YADF**************LK25',
'Key': 'testfolder/testfilemultiupload.csv',
'Intiated':datetime(2021,1,2),
'StorageClass': 'STANDARD'
'Owner':{
'DisplayName': 'AmazonServicesJob'
'Id': '********************'
}
], 'CommonPrefixes': None}