我正在尝试使用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,因此不胜感激。
答案 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])
那应该可以解决您的问题。