amazon-dynamodb - dynamodb : 使用 Python 进行扫描与查询
问题描述
我在 dynamodb 中有一个表格,其中包含以下列元素:
clientId : Primary partition Key
timeId : Sort Key
clientId
是为了区分不同客户端的记录,timeId
只是一个与特定客户端ID相关联的纪元时间戳。该表的示例输出如下所示:
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'])
)
本质上,我试图首先基于两个时间戳对 dynamodb 进行子集化clientId
,然后是两个时间戳——一个开始时间和一个结束时间。我可以使用以下方法获取没有时间戳的所有记录:
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
. 有人可以帮忙吗?
此外,与 timeId 中给出的浮点类型相比,我的开始时间和结束时间搜索输入是 dateColn 中给出的整数。不确定这是否会产生任何错误。
解决方案
我读到我可以使用扫描但也可以在某处阅读扫描不要快速获取记录。由于我的表有数百万行,现在确定我是否应该使用扫描。
DynamoDB 扫描是一项非常昂贵的操作,因为它会读取所有文档,从而消耗大量预置吞吐量。因此scan
应尽量避免查询表。
botocore.exceptions.ClientError:调用查询操作时发生错误(ValidationException):查询条件缺少关键架构元素:clientId
此错误表示clientId
查询中未指定分区键的值。这有点令人困惑,因为该值可能确实是非空的,但这可能意味着分区键需要数字,但args["clientId"]
它是一个不可接受的字符串。请参阅本文档以了解如何指定参数的预期数据类型。
推荐阅读
- excel - 如何将单元格中的值检索到 URL 中
- yii2 - 如何在网格视图中添加空文本框并获取输入值并保存在文本文件中?
- python - 如何在没有 sudo 的情况下使用 python 在 macOS high Sierra 上访问 USB
- django - Django 模板未从数据库呈现
- react-native - 动作创建者未连接到 redux
- javascript - rails text_area format for javascript
- python - How to split seaborn legend into multiple columns?
- c - delete repeated following words in an array
- html - 如何通过迭代图像路径的 ArrayList 在电子邮件正文中添加多个图像内联 HTML?
- keras - 如何在 LSTM 网络 (Keras) 中使用 Dropout 和 BatchNormalization