从列表中更新大量动态模型项目的最佳方法

时间:2019-12-05 21:53:12

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

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

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

我尝试使用

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

其中“ job”是以下方法:

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 price=:new",
        ExpressionAttributeValues={
            ':new': []
        },
        ReturnValues="UPDATED_NEW"
    )

但是,尽管脚本执行没有错误,但是更改并未保留在dynamodb表中,我感到好像我误会了如何在boto3资源上使用进程池以使此任务在500,000以上的效率有所提高项目。

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

1 个答案:

答案 0 :(得分:0)

引用DynamoDB文档here

  

DynamoDB不支持空集。

因此您不能分配空的设置值(我很惊讶该操作未返回错误...)。相反,您应该使用remove的{​​{1}}操作来删除整个set属性。