Статьи

Сканирование элементов DynamoDB с помощью DynamoDBMapper

Ранее мы рассмотрели, как запрашивать базу данных DynamoDB, используя DynamoDBMapper или Java-API низкого уровня .

Помимо выдачи запросов, DynamoDB также предлагает функцию сканирования.
Что делает сканирование, так это выборка всех элементов, которые могут быть у вас в таблице DynamoDB.
Поэтому сканирование не требует никаких правил, основанных на нашем ключе раздела или ваших глобальных / локальных вторичных индексах.
Сканирование предлагает фильтрацию на основе уже выбранных элементов и возвращение определенных атрибутов из выбранных элементов.

Приведенный ниже фрагмент выполняет сканирование таблицы логинов путем фильтрации элементов с более низкой датой.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
public List<Login> scanLogins(Long date) {
 
        Map<String, String> attributeNames = new HashMap<String, String>();
        attributeNames.put("#timestamp", "timestamp");
 
        Map<String, AttributeValue> attributeValues = new HashMap<String, AttributeValue>();
        attributeValues.put(":from", new AttributeValue().withN(date.toString()));
 
        DynamoDBScanExpression dynamoDBScanExpression = new DynamoDBScanExpression()
                .withFilterExpression("#timestamp < :from")
                .withExpressionAttributeNames(attributeNames)
                .withExpressionAttributeValues(attributeValues);
 
        List<Login> logins = dynamoDBMapper.scan(Login.class, dynamoDBScanExpression);
 
        return logins;
    }

Еще одна отличная особенность DynamoDBMapper — параллельное сканирование. Параллельное сканирование делит задачу сканирования между несколькими работниками, по одному для каждого логического сегмента. Рабочие обрабатывают данные параллельно и возвращают результаты.
Обычно производительность запроса на сканирование в значительной степени зависит от количества элементов, хранящихся в таблице DynamoDB. Поэтому параллельное сканирование может снять некоторые проблемы с производительностью запроса на сканирование, так как вам приходится иметь дело с большими объемами данных.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
public List<Login> scanLogins(Long date,Integer workers) {
 
        Map<String, String> attributeNames = new HashMap<String, String>();
        attributeNames.put("#timestamp", "timestamp");
 
        Map<String, AttributeValue> attributeValues = new HashMap<String, AttributeValue>();
        attributeValues.put(":from", new AttributeValue().withN(date.toString()));
 
        DynamoDBScanExpression dynamoDBScanExpression = new DynamoDBScanExpression()
                .withFilterExpression("#timestamp < :from")
                .withExpressionAttributeNames(attributeNames)
                .withExpressionAttributeValues(attributeValues);
 
        List<Login> logins = dynamoDBMapper.parallelScan(Login.class, dynamoDBScanExpression,workers);
 
        return logins;
    }

Перед использованием сканирования в нашем приложении мы должны принять во внимание, что сканирование выбирает все элементы таблицы. Поэтому он имеет высокую стоимость как по расходам, так и по производительности. Кроме того, он может потреблять ваши ресурсы.
Как правило, лучше придерживаться запросов и избегать сканирования.

Вы можете найти полный исходный код с юнит-тестами на github .