У меня есть таблица в 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'])
)
По сути, я пытаюсь поднастроить 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
.Может ли кто-нибудь помочь?
Кроме того, мои начальные и конечные значения времени поиска являются целыми числами, как указано в dateColn, по сравнению с типом с плавающей запятой, как указано в timeId.Не уверен, что это создает какие-либо ошибки.