BatchWriteItem操作:提供的键元素与架构不匹配

时间:2019-05-13 07:46:01

标签: python-2.7 amazon-web-services amazon-s3 amazon-dynamodb

我正在尝试使用AWS Lambda函数将csv数据从S3写入DynamoDB。我目前收到以下错误“ 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(最近一次通话):

     

csv_reader中的文件“ /var/task/lambda_function.py”,第22行   '名称':row.split(',')[1]

     

退出中的文件“ /var/runtime/boto3/dynamodb/table.py”,第156行   self._flush()

     

_flush中的文件“ /var/runtime/boto3/dynamodb/table.py”,第137行   RequestItems = {self._table_name:items_to_send})

     

_api_call返回中的文件“ /var/runtime/botocore/client.py”,第314行   self._make_api_call(operation_name,kwargs)

     

_make_api_call中的文件“ /var/runtime/botocore/client.py”,第612行   引发error_class(parsed_response,operation_name)

     

ClientError:调用时发生错误(ValidationException)   BatchWriteItem操作:提供的键元素与   模式

我希望数据会从CSV文件写入DynamoDB。完全不适用AWS和Python,因此不胜感激。

2 个答案:

答案 0 :(得分:1)

放置物品时,您必须提供所有必填字段,否则它将因上述异常而失败。

仔细检查您的表架构并检查必需值:至少必须有一个哈希键。如果您已使用范围键配置了哈希键,则必须提供两个值。没有您表中的更多信息,我们很难猜测,但是我将尝试在接下来的两行中总结该问题。如果仍然不够用,请使用表模式更新您的问题。

因此,假设您的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]
        })

如果您不确定哈希键和Range键如何协同工作,建议您阅读docs

答案 1 :(得分:0)

您可能会收到此错误,因为您的CSV包含数字。您要记住的是,当您执行row.split(',')时,它会拆分逗号分隔的值,并且此时它们是字符串。因此,您可能已声明为int的主键正在获取字符串值。

要做:

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

那应该可以解决您的问题。