繁体   English   中英

如何使用 boto3 将数据上传到 AWS DynamoDB

[英]how to upload data to AWS DynamoDB using boto3

我是 DynamoDB 的新手,我想使用 boto3 上传数据(file.CSV)下面的代码工作正常,但每当我进行批量上传时,现有数据都会被删除并插入 CSV 文件中的项目。 但我想实现如果表为空插入 CSV 数据。 如果表不为空 append 将 CSV 数据放入 DynamoDB 表而不删除现有数据,指导我如何实现相同。

import boto3
import pandas as pd
import json

AdvgCountries_json = json.loads(
pd.read_csv('data.csv').to_json(orient='records')
)
lst_Dics = [{'item': AdvgCountries_json, 'table':'xxxxxxx'}]

#print(AdvgCountries_json)

#Connect to DynamoDb Function
dynamodb = boto3.resource('dynamodb')

def insertDynamoItem (tablename,item_lst):
    dynamoTable = dynamodb.Table(tablename)
    
    for record in item_lst:
        dynamoTable.put_item(Item=record)
    
    print('Success')
#Upload Content to DynamoDB
for element in lst_Dics:
    insertDynamoItem(element['table'],element['item'])

首先,我将直接回答您的问题(使用一种我不会 go 的方法,但想用它来帮助您了解服务),然后我会在有限的信息下提出更好的方法。

但我想实现如果表为空插入 CSV 数据

使用limit值为1的boto3 DynamoDB 扫描操作,可以快速获取表是否为空的信息。 还有一个选项可以使用 boto3 的describe_table()操作,它包含有关表的项目计数的信息,但该值大约每六个小时更新一次,因此它可能不包含正确的值,具体取决于您想要更新的频率做这样的检查。

if table not empty append 将CSV数据导入DynamoDB表而不删除已有数据

您的问题是,它不会删除数据,而是会覆盖它。

创建表时,除了表名外,还必须指定表的主键。 主键唯一标识表中的每个项目,因此任何两个项目都不能具有相同的键。

因此,当您尝试写入 CSV 数据时,您的分区键与您尝试从 CSV 文件写入的分区键相同。 在这种情况下,与您尝试写入的记录具有相同分区键的 DynamoDB 行的内容将被新数据覆盖。

是的,您可以添加一个排序键,这意味着您将拥有一个复合主键,其中分区键保持不变,而排序键是一个唯一的附加值。 这样,您可以拥有多个相等的分区键,但它们会通过排序键进行区分,并且您的数据不会被覆盖(如果您不尝试再次写入相同的复合主键值)。

但是,要添加排序键(如果表创建时不存在排序键),您必须重新创建表,因为 AWS 不允许您在创建表后添加排序键。 在你的情况下这可能是不可能的,所以这里有一种替代方法,如果你不处理大规模的事情,它应该不会对你产生太大影响。

使用 boto3 的get_item() function 并检查分区键是否存在。 如果返回任何数据,则该行存在,您需要决定是要保留以前的数据还是添加您的数据。 您甚至可以使用batch_get_item() function,应用一些逻辑,然后对您要在表中添加/覆盖的记录执行batch_write_item()操作。

如果可能的话,使用排序键方法将是我的第一种方法。 使用 get item 调用会引入不必要的时间和金钱成本。 使用排序键允许您为同一分区键拥有多个行,但具有不同的排序键。

希望这可以帮助!

将实用的 CSV 文件导入 DynamoDB 的一种简单方法是使用AWS Wrangler(对于 Pandas,也称为 AWS SDK)

import awswrangler as wr
import pandas as pd
from pathlib import Path

filepath = Path("items.csv")
df.to_csv(filepath, index=False)
wr.dynamodb.put_csv(path=filepath, table_name="table")
filepath.unlink()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM