У меня есть таблица в 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, а затем следуют две временные метки - время начала и время окончания. Я мог получить все записи без временных меток, используя следующее:
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, по сравнению с типом float, указанным в timeId. Не уверен, что это создает какие-либо ошибки.





I read that I could use scan but also read somewhere scan don't fetch the records quickly. Since my table has millions of rows, now sure if I should use scan.
Сканирование DynamoDB - очень дорогостоящая операция, поскольку при этом читаются все документы, что потребляет значительную часть выделенной пропускной способности. Следовательно, scan следует по возможности воздерживаться от запросов к таблице.
botocore.exceptions.ClientError: An error occurred (ValidationException) when calling the Query operation: Query condition missed key schema element: clientId
Эта ошибка означает, что значение ключа раздела clientId не указано в запросе. Это немного сбивает с толку, поскольку значение действительно может быть непустым, но это может означать, что ключ раздела ожидает число, но args["clientId"] - это строка, которая неприемлема. Пожалуйста, обратитесь к документации это, чтобы узнать, как указать предполагаемый тип данных аргументов.
Очевидная проблема с вашим запросом заключается в том, что вы используете and вместо &.
Используя "и", вы в основном удаляете первую часть вашего запроса.
Спасибо ... Поскольку я не мог заставить его работать и у меня были более сжатые сроки, я перешел на публикацию лямбда-сообщений в Elasticsearch. Спасибо. Я попробую это в следующий раз.
Спасибо за ваш ответ. Я просмотрю документацию и вернусь