首页 > 解决方案 > 在 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])

标签: pythonjsonamazon-s3aws-lambda

解决方案


似乎您正在以原始形式拆分数据,这意味着 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 文件。


推荐阅读