Как получить самые последние данные из DynamoDB для каждого первичного ключа раздела? - PullRequest
0 голосов
/ 14 мая 2019

У меня есть таблица в DynamodB. Хранит статистику аккаунта. Возможно, статистика аккаунта будет обновляться несколько раз в день. Таким образом, записи таблицы могут выглядеть следующим образом:

+------------+--------------+-------+-------+
| account_id | record_id    | views | stars |
+------------+--------------+-------+-------+
| 3          | 2019/03/16/1 | 29    | 3     |
+------------+--------------+-------+-------+
| 2          | 2019/03/16/2 | 130   | 21    |
+------------+--------------+-------+-------+
| 1          | 2019/03/16/3 | 12    | 2     |
+------------+--------------+-------+-------+
| 2          | 2019/03/16/1 | 57    | 12    |
+------------+--------------+-------+-------+
| 1          | 2019/03/16/2 | 8     | 2     |
+------------+--------------+-------+-------+
| 1          | 2019/03/16/1 | 3     | 0     |
+------------+--------------+-------+-------+

account_id является основным ключом раздела. record_id это первичный ключ сортировки

Как я могу получить только последние записи для каждого из account_id с? Так что из приведенного выше примера я ожидаю получить:

+------------+--------------+-------+-------+
| account_id | record_id    | views | stars |
+------------+--------------+-------+-------+
| 3          | 2019/03/16/1 | 29    | 3     |
+------------+--------------+-------+-------+
| 2          | 2019/03/16/2 | 130   | 21    |
+------------+--------------+-------+-------+
| 1          | 2019/03/16/3 | 12    | 2     |
+------------+--------------+-------+-------+

Эти данные удобно использовать для отчетности.

Ответы [ 2 ]

1 голос
/ 14 мая 2019

Это можно сделать довольно эффективно, если вы знаете список account_id с, который вы сохранили в таблице.

В этом случае все, что вам нужно сделать, это запросить первичные ключи, один за другим, отсортировать значения с помощью ScanIndexForward=False и ограничить результат 1 элементом с помощью Limit=1.

Вот код на python

import boto3
import json

client = boto3.client('dynamodb')

account_ids = ['1', '2', '3']
results = []

for aid in account_ids:
    result = client.query(
        TableName='test-table',
        KeyConditionExpression="#aid = :aid",
        ExpressionAttributeNames={
            '#aid': 'account_id'
        },
        ExpressionAttributeValues={
            ':aid': {
                'N': aid
            }
        },
        ScanIndexForward=False,
        Limit=1,
    )
    results.append(result['Items'])

print(json.dumps(results, indent=2))
1 голос
/ 14 мая 2019

Элементы с одним и тем же ключом раздела хранятся в одном и том же разделе и упорядочены по их ключу сортировки. Таким образом, если вы запросите элементы в обратном порядке и установите ограничение в 1, вы получите элемент с требуемым значением account_id и максимальным значением record_id.

Итак, выполните запрос к соответствующему account_id, но укажите Limit=1 и ScanIndexForward=False (или Reverse=True в зависимости от того, какой SDK / API вы используете).

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