当前位置: 首页 > 知识库问答 >
问题:

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

莘绍元
2023-03-14

我正在尝试使用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]
            })

错误如下所示:

调用BatchWriteItem操作时发生错误(ValidationExc0019):提供的键元素与模式不匹配:ClientError Traceback(最近的调用最后一次):

文件“/var/task/lambda_function.py”,第22行,在csv_读取器“名称”中:row.split(',')[1]

文件“/var/runtime/boto3/dynamodb/table.py”,第156行,在exit self.\u flush()中

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

文件“/var/runtime/botocore/client.py”,第314行,在api调用返回self.\u make\u api\u调用中(操作名称,kwargs)

文件“/var/runtime/botocore/client.py”,第612行,在“生成api调用引发错误”类中(解析的响应,操作名称)

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

我希望数据从CSV文件写入DynamoDB。对AWS来说是全新的

共有2个答案

司徒骞尧
2023-03-14

您可能会遇到此错误,因为您的CSV包含数字。您必须记住的是,当您执行row.split(',')时,它会分割逗号分隔的值,此时它们是字符串。因此,您可能声明为int的主键将获得一个字符串值。

做:

'Customer-ID':int(行分割(',')[0])

那应该能解决你的问题。

夔学智
2023-03-14

当放置一个项目时,您必须提供所有必需的字段,否则它将失败,出现上述异常。

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

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

如果您不确定散列和范围键如何协同工作,我建议您阅读文档

 类似资料:
  • 我在DynamoDB中创建了一个表“user\u info”,其中有一个主哈希键“user\u id”(String),没有范围键。然后,我创建了2个AWS lambda函数来插入和查询项目。我可以将项目插入表中,但查询表时,它会返回: ValidationException:提供的键元素与架构不匹配。 我的查询功能: 我一直得到这个例外: 自从 1) 我只有一个哈希主键。 2)user_id定义

  • 我在Boto3/DynamoDB BatchGetItem操作中遇到困难。我将非常感谢任何帮助或指导!我对python/aws非常陌生,如果这是一个新手问题,那么很抱歉在高级版。 当我执行该操作时,会出现以下错误: 这是我的代码: 这是表中项目的屏幕盖。 这是表详细信息的屏幕盖,显示分区键为'item_ID',是'string' 以下是完整的错误消息:

  • 我正在尝试使用boto3从DynamoDB查询项目。 该表如下所示: DynamoDB表 我运行的代码是: 我错过了什么?

  • 当我试图从表中获取项目时,它会打印此错误 botocore.exceptions.ClientError:调用GetItem操作时发生错误(ValidationException):提供的键元素与架构不匹配 这是我的密码 有什么想法吗?谢谢

  • 我正在尝试更新Dynamodb表用户中的一项。我尝试了许多不同的方法,但总是收到相同的错误消息: 提供的键元素与架构不匹配 项目的创建与查询一样有效,但更新不起作用。当我在DynamoDB上检查时,用户创建得很好: 下面是表格信息: 表名:用户 主分区键:电子邮件(字符串) 主排序键:注册(编号) 下面是代码(从lambda调用): 你知道我的代码中可能有什么错误吗?

  • 我正在尝试使用boto和python删除DynamoDB表中的大量项。我的表是用主键作为设备ID(想想MAC地址)设置的。表中有多个设备ID条目,因为主键是UNIX时间戳。 从我的阅读代码应该工作: 来源:http://docs.pythonboto.org/en/latest/dynamodb2_tut.html#batch-writing 但是,它返回“提供的键元素与架构不匹配”作为错误消息。