Python DynamoDB-避免数据覆盖,所有数据点的主分区键保持不变

Python DynamoDB-避免数据覆盖,所有数据点的主分区键保持不变,python,amazon-web-services,amazon-s3,amazon-dynamodb,boto3,Python,Amazon Web Services,Amazon S3,Amazon Dynamodb,Boto3,我正在将存储在s3中的csv文件中的数据迁移到DynamoDB中的表中。代码似乎在工作,但只有最后一个数据点被发布在DynamoDB上。所有数据点的主分区键(串行)都相同。我不确定我在这里是否做错了什么,非常感谢您的帮助 import boto3 s3_client = boto3.client("s3") dynamodb = boto3.resource('dynamodb') table = dynamodb.Table('scan_records') def lambda_hand

我正在将存储在s3中的csv文件中的数据迁移到DynamoDB中的表中。代码似乎在工作,但只有最后一个数据点被发布在DynamoDB上。所有数据点的主分区键(串行)都相同。我不确定我在这里是否做错了什么,非常感谢您的帮助

import  boto3
s3_client = boto3.client("s3")

dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('scan_records')

def lambda_handler(event, context):
    bucket_name = event['Records'][0]['s3']['bucket']['name']
    s3_file_name = event['Records'][0]['s3']['object']['key']
    resp = s3_client.get_object(Bucket=bucket_name,Key=s3_file_name)
    data = resp['Body'].read().decode("utf-8")
    scan_time = data.split("\n")
    for scan in scan_time:
        print(scan)
        scan_data = scan.split(",")

    # Add it to dynamoDB

    try: 
         table.put_item(
         Item  = {
            'serial' : scan_data[0],
            'time' : scan_data[1],
        }
    )

    except Exception as e:
        print("End of File")

在dynamoDb表中,表中每个元素的主键都必须是唯一的。因此,如果主键只由一个分区键组成,而该分区键对于所有数据点都是相同的,那么将始终覆盖相同的元素。 *您可以向表中添加一个使用另一个字段的排序键,以便组成主键的分区键、排序键对是唯一的,从而将数据附加到表中。
*如果无法使用由数据点组成的唯一主键,则始终可以向主键添加UUID以使其唯一。

在dynamoDb表中,主键对于表中的每个元素都必须是唯一的。因此,如果主键只由一个分区键组成,而该分区键对于所有数据点都是相同的,那么将始终覆盖相同的元素。 *您可以向表中添加一个使用另一个字段的排序键,以便组成主键的分区键、排序键对是唯一的,从而将数据附加到表中。
*如果无法使用由数据点组成的唯一主键,则始终可以向主键添加UUID以使其唯一。

ConditionExpression='attribute\u not\u exists(串行)和attribute\u not\u exists(时间)',

在做了以下两个更改后,问题得到了解决,代码运行良好。 1.使用分区和排序键组合检查的唯一条目 2.在csv文件中逐行添加循环,并将数据摄取到DynamoDB中


如果有人觉得代码有用,很高兴与大家分享

ConditionExpression='attribute\u not\u exists(串行)和attribute\u not\u exists(时间)',

在做了以下两个更改后,问题得到了解决,代码运行良好。 1.使用分区和排序键组合检查的唯一条目 2.在csv文件中逐行添加循环,并将数据摄取到DynamoDB中


如果有人觉得代码有用,很高兴与大家分享

表中是否定义了排序键?主分区键-“串行”和主排序键-“时间”找到了解决方案。串行+时间导致DynamoDBIs的唯一条目。在表中定义了排序键?主分区键-“串行”和主排序键-“时间”找到了解决方案。串行+时间导致进入DynamoDBSo的唯一条目我有一个主排序键,即“时间”。关于如何结合使用分区和排序键来告诉DynamoDB它是唯一的数据的任何建议。在此提前感谢您的帮助。请注意,对于每个唯一的记录,序列+时间必须是唯一的。如果您的系统可以生成具有相同串行+时间值的记录,例如从2个并行进程生成的记录,则串行+时间将导致数据丢失(除非您使用条件插入以防止意外覆盖)。明白。谢谢你,贾莫德,找到了解决办法。串行+时间导致进入DynamoDBSo的唯一条目我有一个主排序键,即“时间”。关于如何结合使用分区和排序键来告诉DynamoDB它是唯一的数据的任何建议。在此提前感谢您的帮助。请注意,对于每个唯一的记录,序列+时间必须是唯一的。如果您的系统可以生成具有相同串行+时间值的记录,例如从2个并行进程生成的记录,则串行+时间将导致数据丢失(除非您使用条件插入以防止意外覆盖)。明白。谢谢你,贾莫德,找到了解决办法。串行+时间导致DynamoDBShort的唯一入口,只有代码的答案在堆栈溢出时通常不受欢迎。为了避免被标记为“低质量”,请考虑添加一些解释性文本。为了避免被标记为“低质量”,请考虑添加一些解释性文本。