Я работаю над переносом данных из CSV-файла, хранящегося в s3, в таблицу в 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")
0
Manjunath ANAND 30 Дек 2019 в 19:21
2
Определен ли для таблицы ключ сортировки?
 – 
Mark B
30 Дек 2019 в 19:29
Первичный ключ раздела - «Серийный» и первичный ключ сортировки - «Время»
 – 
Manjunath ANAND
30 Дек 2019 в 21:51
Нашел решение. Последовательный + время приводит к уникальной записи в DynamoDB
 – 
Manjunath ANAND
31 Дек 2019 в 08:20

2 ответа

ConditionExpression='attribute_not_exists(serial) AND attribute_not_exists(time)',

После двух изменений проблема была решена, и код работает нормально. 1. Уникальная запись, проверенная с помощью комбинации ключа разделения и сортировки. 2. Добавьте цикл, чтобы переходить строка за строкой в CSV-файл и загружайте данные в DynamoDB.

Рад поделиться кодом, если кто-нибудь найдет его полезным.

0
Community 31 Дек 2019 в 17:09
2
Короткие ответы, состоящие только из кода, часто не одобряются в Stack Overflow. Чтобы избежать отметки о «низком качестве», рассмотрите возможность добавления пояснительного текста.
 – 
Adrian Mole
31 Дек 2019 в 09:00

В вашей таблице DynamoDb ваш первичный ключ должен быть уникальным для каждого элемента в таблице. Поэтому, если ваш первичный ключ состоит только из ключа раздела, который одинаков для всех ваших данных, вы всегда будете перезаписывать один и тот же элемент. * Вы можете добавить в свою таблицу ключ сортировки, который использует другое поле, чтобы ключ раздела, пара ключей сортировки, составляющая первичный ключ, были уникальными и, следовательно, добавляли данные в вашу таблицу. * Если у вас нет уникального первичного ключа, составленного из ваших точек данных, вы всегда можете добавить UUID к первичному ключу, чтобы сделать его уникальным.

2
FransDel 30 Дек 2019 в 19:58
Итак, у меня есть первичный ключ сортировки «время». Любые предложения о том, как использовать комбинацию раздела и ключа сортировки, чтобы сообщить DynamoDB, что это уникальные данные. Заранее благодарим за вашу помощь.
 – 
Manjunath ANAND
30 Дек 2019 в 21:54
2
Имейте в виду, что серийный номер + время должен быть уникальным для каждой уникальной записи. Если ваша система может создавать записи с одинаковыми значениями серийного + времени, например из двух параллельных процессов, то последовательный + время приведет к потере данных (если вы не используете условные вставки для предотвращения случайной перезаписи).
 – 
jarmod
31 Дек 2019 в 03:34
Понял. Спасибо, Джармод.
 – 
Manjunath ANAND
31 Дек 2019 в 08:19
Нашел решение. Последовательный + время приводит к уникальной записи в DynamoDB
 – 
Manjunath ANAND
31 Дек 2019 в 08:20