首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用DynamoDB将数据上传到AWS DynamoDB

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

Stack Overflow用户
提问于 2022-09-28 10:04:25
回答 2查看 145关注 0票数 0

我对DynamoDB非常陌生,我想使用boto3 来上传数据(file.CSV) --下面的代码运行良好,但是每当我进行批量上传时,现有的数据就被删除,并插入CSV文件中的项。但是我想实现如果表是空的,插入CSV数据。如果表不为空,在不删除现有数据的情况下将CSV数据追加到DynamoDB表中,请指导我如何实现这些数据。

代码语言:javascript
复制
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'])
EN

回答 2

Stack Overflow用户

发布于 2022-09-28 15:21:14

首先,我将直接回答您的问题(使用一种我不愿意使用的方法,但希望使用它来帮助您理解服务),然后,鉴于信息有限,我将提出一个更好的方法(Es)。

但是我想实现如果表是空的,插入CSV数据

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

如果表不为空,则将CSV数据追加到DynamoDB表中,而不删除现有数据

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

创建表时,除了表名外,还必须指定表的主键。主键唯一地标识表中的每个项,因此没有两个项可以具有相同的键。

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

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

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

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

如果可能的话,使用排序关键方法将是我的第一条路。使用get项目调用会带来不必要的时间和金钱成本。使用排序键可以为同一分区键拥有多个行,但可以使用差异排序键。

希望这能有所帮助!

票数 0
EN

Stack Overflow用户

发布于 2022-09-30 04:31:28

实现将CSV文件导入DynamoDB的一个简单方法是使用AWS Wrangler (AKA AWS SDK for Pandas)

代码语言:javascript
复制
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()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73879599

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档