【问题标题】:Best way to update a large number of dynamodb items from a list从列表中更新大量 dynamodb 项目的最佳方法
【发布时间】:2019-12-05 21:53:12
【问题描述】:

我有一个大约 500,000 个字符串的 python 列表,列表中的每个元素对应于我要更新的 dynamodb 表中的一个项目的 id。

我的问题是,遍历此列表并对每个项目执行相同更新查询的最佳方法是什么?

我试过用

data = pd.read_csv(filename)
pool = Pool(50)
results = pool.imap_unordered(job, data['item_id'].astype(str).tolist())

其中“工作”是以下方法:

def job(item_id):
    dynamodb = boto3.resource(
        'dynamodb',
        aws_access_key_id=aws_access_key_id,
        aws_secret_access_key=aws_secret_access_key,
        aws_session_token=aws_session_token,
        region_name=region
    )
    table = dynamodb.Table('my-table')
    response = table.update_item(
        Key={
            "id": item_id
        },
        UpdateExpression="set x=:new",
        ExpressionAttributeValues={
            ':new': []
        },
        ReturnValues="UPDATED_NEW"
    )

但是,虽然脚本执行没有错误,但更改不会保留在 dynamodb 表中,我感觉好像我误解了如何在 boto3 资源上使用进程池以使此任务在 500,000 以上项目。

还值得注意的是,当我打印出收到的响应时,我收到了 HTTP 200 响应。

【问题讨论】:

  • 批量写入器用于放置整个记录而不是更新记录中的单个属性对吗?我正在尝试将嵌套属性“价格”设置为空列表,从而有效地清除 500k 记录的此属性。我使用 update_item 是因为我只想更新一个属性

标签: python amazon-web-services multiprocessing amazon-dynamodb boto3


【解决方案1】:

引用 DynamoDB 文档here

DynamoDB 不支持空集。

所以你不能分配一个空的设置值(我很惊讶操作没有返回错误......)。相反,您应该使用UpdateItemremove 操作来删除整个集合属性。

【讨论】:

  • 我认为使用空数组更新记录中的现有数组项没有问题,我可以在更新单个记录时执行此操作。另外,我正在完成的任务的要求之一是不删除该属性。当我尝试使用池对 500k 个项目的数组执行任务时,似乎会发生此问题。
猜你喜欢
  • 2021-03-07
  • 1970-01-01
  • 2016-07-08
  • 2016-12-03
  • 1970-01-01
  • 2013-07-23
  • 1970-01-01
  • 2016-11-08
  • 1970-01-01
相关资源
最近更新 更多