dynamodb:使用Python扫描与查询

问题描述 投票:1回答:2

我在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"])

但是,当我包含startdate和time时,我收到以下错误:

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类型相比。不确定是否会产生任何错误。

amazon-dynamodb
2个回答
1
投票

您的查询的一个明显问题是您使用and而不是&通过使用'和',您基本上删除了查询的第一部分。


0
投票

我读过我可以使用扫描,但也读取某处扫描不能快速获取记录。由于我的表有数百万行,现在确定我是否应该使用扫描。

DynamoDB扫描是一项非常昂贵的操作,因为它会读取所有文档,从而消耗大量的预配置吞吐量。因此,scan应该尽可能地避免查询表格。

botocore.exceptions.ClientError:调用Query操作时发生错误(ValidationException):查询条件错过了关键架构元素:clientId

此错误意味着未在查询中指定分区键clientId的值。这有点令人困惑,因为该值可能确实是非空的,但它可能意味着分区键期望数字,但args["clientId"]是一个不可接受的字符串。有关如何指定参数的预期数据类型,请参阅this文档。

© www.soinside.com 2019 - 2024. All rights reserved.