向 S3 发送大于 5GB 的数据帧

Sending larger than 5GB dataframe to S3

我正在尝试将数据帧上传到 S3。数据框是通过获取多个数据源并将它们连接在一起以及执行一些转换来创建的。这些操作完全在内存中完成。我还需要将数据存储到 s3 中,其中每一行都是一个 json 记录:

{"key_1": "value_11", "key_2": "value_12", ...}
{"key_1": "value_21", "key_2": "value_22", ...}
...

我使用的是 put_object(),在表格变大之前没有任何问题。

代码段

...

json_buffer = StringIO()
df_copy.to_json(json_buffer, orient="records", lines=True)
json_buffer.seek(0)

# self.__s3.put_object(
#     Bucket=bucket, 
#     Body=json_buffer.getvalue(), 
#     Key=key_json)

GB = 1024 ** 3
# Ensure that multipart uploads only happen if the size of a transfer
# is larger than S3's size limit for nonmultipart uploads, which is 5 GB.
upl_config = TransferConfig(multipart_threshold=5*GB)

self.__s3.upload_fileobj(
    json_buffer,
    Bucket=bucket, 
    Key=key_json,
    Config=upl_config)

使用上面的代码我得到以下错误:

TypeError: Unicode-objects must be encoded before hashing

我尝试了以下方法:

问题: 无论如何将数据保存为 json 记录而不是 csv 像其他问题一样?

看起来您需要传入字节缓冲区而不是 str。尝试使用 BytesIO 而不是 StringIO。

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html#S3.Client.upload_fileobj