python - 在 AWS Lambda 上将大 json 文件拆分为较小的 json 文件并将其保存在 S3 上
问题描述
假设这是一个大文件。
我想将文件分成多个块。例如,如果我有一个 500 MB 的 JSON 文件,并且我想将其拆分为不同的块。可接受的最大文件大小为 30 MB(30000000 字节)。此函数在 aws lambda 上运行,结果应保存在 s3 存储桶中。请问我该怎么做?
{
"start":"HelloI",
"users": [
{
"id": 1,
"name": "Leanne Graham",
"username": "Bret",
"address": {
"street": "Kulas Light",
"suite": "Apt. 556",
"city": "Gwenborough"
}
},
{
...
}
]
}
这是我的代码。我相信我做错了什么。任何帮助将不胜感激谢谢。
json_size = 50580490;
MIN_SIZE = 30000000;
data_len = len(file)
get_array_length = len(file["users"])
print("Print data len : ",data_len)
print("Print Get Array length : ", get_array_length)
items = []
if isinstance(file, dict):
print('Valid JSON file found')
# determine number of files necessary
split_into_files = math.ceil(json_size/MIN_SIZE)
print(f'File will be split into {split_into_files} equal parts')
split_data = [[] for i in range(0,split_into_files)]
print('split_data : ', split_data)
starts = [math.floor(i * get_array_length/split_into_files) for i in range(0,split_into_files)]
starts.append(data_len)
print('starts : ', starts)
for i in range(0,split_into_files):
for n in range(starts[i], starts[i+1]):
print('The value for N is: ' , n)
print("split_data[i] :" , split_data[i])
#print(file["users"][n])
split_data[i].append(file["users"][n])
print(split_data[i])
解决方案
似乎您正在以原始形式拆分数据,这意味着 json 是分层结构,当您直接拆分数据时,它不会识别记录,而是可能会破坏结构。
您可以先将用户元素读入任何其他结构,例如列表/数据框。
with open('users.json','r') as f:
user_list = json.load(f)
users_data = user_list['users']
(您需要从 json 文件中的用户列表开始读取,因为文件中有另一列 - 例如“开始”)
然后您将拥有 users_data 中的所有记录,然后根据 json 记录数您可以进行相应的拆分。如果您想在此过程中添加一些性能以供将来使用 - 您可以对 users_data 中的记录进行排序并将记录拆分为单独的 json 文件。
推荐阅读
- c# - 在使用 C# 的 EncryptedXml 加密方法中查找符合 FIPS 的错误
- c - Ubuntu Linux下输入和输出的Libusb错误-USB的C编程
- c++ - 通过数组随机递增,c ++
- matrix - 检查具有给定秩的矩阵是否是半正定的(在 Julia 中)
- excel - .Cells.PageBreak = xlPageBreakNone 错误 -1004 - 无法设置分页符属性
- javascript - 在 html 中的学生成绩表中将包含“-”的单元格的颜色更改为黄色
- java - 从 charAt 保存为 int
- karate - 空手道 UI 跨浏览器示例
- php - Amadeus e-Power Web Service - 设置 SOAP 身份验证标头时出现问题
- android - 当我尝试在片段中动态更改 TextView 值时没有任何反应