Операция BatchWriteItem: предоставленный ключевой элемент не соответствует схеме - PullRequest
0 голосов
/ 13 мая 2019

Я пытаюсь записать данные в формате csv из S3 в DynamoDB с помощью функции AWS Lambda.В настоящее время я получаю следующую ошибку «Операция BatchWriteItem: предоставленный ключевой элемент не соответствует схеме».

Есть ли быстрое решение этой проблемы?

import boto3

s3 = boto3.client('s3')
dynamodb = boto3.resource('dynamodb')

def csv_reader(event, context):

    bucket = event['Records'][0]['s3']['bucket']['name']
    key = event['Records'][0]['s3']['object']['key']

    obj = s3.get_object(Bucket=bucket, Key=key)

    rows = obj['Body'].read().split('\n')

    table = dynamodb.Table('customer_id')

    with table.batch_writer() as batch:
        for row in rows:
            batch.put_item(Item={

                'Customer-ID':row.split(',')[0],
                'Name':row.split(',')[1]
            })

Ошибка выглядит следующим образом:

Произошла ошибка (ValidationException) при вызове операции BatchWriteItem: предоставленный ключевой элемент не соответствует схеме: ClientError Traceback (самая последняяпоследний вызов):

Файл "/var/task/lambda_function.py", строка 22, в csv_reader 'Name': row.split (',') [1]

File "/var/runtime/boto3/dynamodb/table.py ", строка 156, в выход self._flush ()

Файл" /var/runtime/boto3/dynamodb/table.py", строка 137, в _flush RequestItems = {self._table_name: items_to_send})

Файл" /var/runtime/botocore/client.py ", строка 314, в _api_call возвращает self._make_api_call (имя_операции, kwargs)

Файл "/var/runtime/botocore/client.py", строка 612, в _make_api_call повысить error_class (parsed_response, имя_операции)

ClientError: Произошла ошибка (ValidationException) при вызовеОперация BatchWriteItem: предоставленный ключевой элемент не соответствует схеме

Я ожидаю, что данные будут записаны из файла CSV в DynamoDB.Абсолютно новый для AWS & Python, поэтому любая помощь будет оценена.

Ответы [ 2 ]

1 голос
/ 13 мая 2019

При размещении элемента необходимо указать все обязательные поля, в противном случае произойдет сбой с упомянутым исключением.

Дважды проверьте схему таблицы и проверьте обязательные значения: по крайней мере, обязательным является хэш-ключ. Если вы настроили Hash Key с ключом Range, вы должны указать оба значения. Без дополнительной информации из вашей таблицы нам будет трудно догадаться, но я постараюсь обобщить проблему в следующих нескольких строках. Если этого по-прежнему недостаточно, обновите ваш вопрос с помощью схемы таблиц.

Допустим, ваш HashKey называется id, ваш код должен выглядеть следующим образом:

batch.put_item(Item={
            'id': 'some-id'
            'Customer-ID':row.split(',')[0],
            'Name':row.split(',')[1]
        })

Если ключ диапазона также установлен и имеет имя, скажем, test, то ваш код должен выглядеть следующим образом:

batch.put_item(Item={
            'id': 'some-id',
            'test': 'some-value',
            'Customer-ID':row.split(',')[0],
            'Name':row.split(',')[1]
        })

Если вы не уверены, как работают ключи Hash и Range, советуем прочитать документы

0 голосов
/ 22 июня 2019

Вы, вероятно, получаете эту ошибку, потому что ваш CSV содержит числа. Следует помнить, что когда вы делаете row.split(','), он разделяет значения через запятую, и на этом этапе они являются строками. Таким образом, ваш первичный ключ, который вы, вероятно, объявили как int, получает строковое значение.

Do:

'Customer-ID':int(row.split(',')[0])

Это должно решить вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...