我在dynamodb中有一个带有以下列元素的表:
clientId : Primary partition Key
timeId : Sort Key
clientId
用于区分不同客户端的记录,timeId
只是链接到特定clientID的时期时间戳记。该表的示例输出如下所示:
clientId timeId Bucket dateColn
0000000028037c08 1544282940.0495 MyAWSBucket 1544282940
0000000028037c08 1544283640.119842 MyAWSBucket 1544283640
我正在使用以下代码来获取记录:
ap.add_argument("-c","--clientId",required=True,help="name of the client")
ap.add_argument("-st","--startDate",required=True,help="start date to filter")
ap.add_argument("-et","--endDate",required=True,help="end date to filter")
args = vars(ap.parse_args())
dynamodb = boto3.resource('dynamodb', region_name='us-west-1')
table = dynamodb.Table('MyAwsBucket-index')
response = table.query(
KeyConditionExpression=Key('clientId').eq(args["clientId"]) and Key('timeId').between(args['startDate'], args['endDate'])
)
基本上,我试图首先基于clientId
来对dynamodb进行子集化,然后再添加两个时间戳-开始时间和结束时间。我可以使用以下命令获取没有时间戳的所有记录:
KeyConditionExpression=Key('clientId').eq(args["clientId"])
但是,当我包含开始日期和时间时,出现以下错误:
botocore.exceptions.ClientError: An error occurred (ValidationException) when calling the Query operation: Query condition missed key schema element: clientId
如何解决此问题,并同时使用clientId以及开始时间和结束时间。我听说我可以使用scan
,但也可以在scan
某处阅读,因此无法快速获取记录。由于我的表有数百万行,因此现在确定是否应该使用scan
。有人可以帮忙吗?
我的开始时间和结束时间搜索输入也是dateColn中给出的整数,而timeId中给出的是float类型。不知道这是否会产生任何错误。
答案 0 :(得分:1)
查询的一个明显问题是您使用的是and
而不是&
通过使用“和”,您基本上是在删除查询的第一部分。
答案 1 :(得分:0)
我读到我可以使用扫描,但是在某些地方也可以读取扫描,因此无法快速获取记录。由于我的表有数百万行,因此现在确定是否应该使用扫描。
DynamoDB扫描是一项非常昂贵的操作,因为它读取所有文档,从而消耗了很多预配置的吞吐量。因此,应尽量避免scan
来查询表。
botocore.exceptions.ClientError:调用Query操作时发生错误(ValidationException):查询条件缺少关键架构元素:clientId
此错误表示未在查询中指定分区键clientId
的值。这有点令人困惑,因为该值可能确实是非空的,但这可能意味着分区键需要数字,但是args["clientId"]
是不可接受的字符串。请参阅this文档,以了解如何指定参数的预期数据类型。