Ранее мы рассмотрели, как запрашивать базу данных 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 .
Ссылка: | Сканируйте элементы DynamoDB с помощью DynamoDBMapper от нашего партнера по JCG Эммануила Гкациоураса в блоге gkatzioura . |