Dynamodb: сканирование против запроса с использованием Python - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть таблица в 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.Не уверен, что это создает какие-либо ошибки.

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Очевидная проблема с вашим запросом состоит в том, что вы используете and вместо & Используя 'и', вы в основном удаляете первую часть вашего запроса.

0 голосов
/ 10 декабря 2018

Я прочитал, что могу использовать сканирование, но также читаю где-то, сканирование не приводит к быстрой загрузке записей.Поскольку в моей таблице миллионы строк, теперь убедитесь, что мне следует использовать сканирование.

Сканирование DynamoDB - очень дорогая операция, поскольку она считывает все документы, тем самым потребляя большую часть выделенной пропускной способности.Следовательно, scan следует как можно больше воздерживаться от запроса таблицы.

botocore.exceptions.ClientError: Произошла ошибка (ValidationException) при вызове операции Query: условие запроса пропущено ключевой элемент схемы: clientId

Эта ошибка подразумевает, что значениеключа разделения clientId не указан в запросе.Это немного сбивает с толку, поскольку значение действительно может быть не пустым, но это может означать, что ключ раздела ожидает число, но args["clientId"] - это строка, которая недопустима.Пожалуйста, обратитесь к этой документации, чтобы узнать, как указать предполагаемый тип данных аргументов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...