DynamoDBでscanを実行してみる
DynamoDBのテーブル名が SampleTable, AttributeがIdとNameのみのテーブルに対してScanを実行した。
AWS SDK for Javaで以下のように実行してみた。
import java.io.IOException; import java.util.Arrays; import java.util.HashMap; import java.util.Map; import com.amazonaws.auth.AWSCredentials; import com.amazonaws.auth.PropertiesCredentials; import com.amazonaws.services.dynamodb.AmazonDynamoDBClient; import com.amazonaws.services.dynamodb.model.AttributeValue; import com.amazonaws.services.dynamodb.model.ComparisonOperator; import com.amazonaws.services.dynamodb.model.Condition; import com.amazonaws.services.dynamodb.model.GetItemRequest; import com.amazonaws.services.dynamodb.model.GetItemResult; import com.amazonaws.services.dynamodb.model.Key; import com.amazonaws.services.dynamodb.model.PutItemRequest; import com.amazonaws.services.dynamodb.model.PutItemResult; import com.amazonaws.services.dynamodb.model.ScanRequest; import com.amazonaws.services.dynamodb.model.ScanResult; public class DynamoDBLoadGenerator { static AmazonDynamoDBClient dynamoDB; public static void main(String[] args) throws IOException { //Credentialsの設定 AWSCredentials credentials = new PropertiesCredentials( DynamoDBSample.class.getResourceAsStream("AwsCredentials.properties")); //リクエストのパラメータの設定 dynamoDB = new AmazonDynamoDBClient(credentials); dynamoDB.setEndpoint("http://dynamodb.ap-northeast-1.amazonaws.com"); String tableName = "SampleTable"; //ScanFilterConditionの設定 Condition scanFilterCondition = new Condition() .withComparisonOperator(ComparisonOperator.LT.toString()) //〇〇よりも小さい .withAttributeValueList(new AttributeValue().withN("500")); //500 Map<String, Condition> conditions = new HashMap<String, Condition>(); conditions.put("Id", scanFilterCondition); ScanRequest scanRequest = new ScanRequest() .withTableName(tableName) .withScanFilter(conditions) .withAttributesToGet(Arrays.asList("Id")); //Idに対してScanFilterを実行 //Scan実行 ScanResult scanResult = dynamoDB.scan(scanRequest); //結果表示 for (Map<String, AttributeValue> item : scanResult.getItems()){ System.out.println(item.get("Id")); } } }
実行結果は以下のように出力される。
{N: 251, } {N: 187, } {N: 154, } {N: 7, } {N: 115, } {N: 286, } {N: 361, } {N: 380, } {N: 117, } {N: 401, } {N: 47, } {N: 184, } {N: 403, } {N: 304, } {N: 156, } {N: 122, } {N: 273, } 以下省略
IDが500以下のデータが出力された。
また今回使用したScanFilterConditionでComparisonOperatorで、BETWEENやBEGIN WITHやCONTAINなどいろいろ指定できる。今回使ったのはLT(おそらくはLess Thanのことだと思う)。これでscanするフィルターをいろいろ設定できそう。
試しにNameが"Book 500"とイコールであるIdをFilterConditionで指定したのが以下。
//ScanFilterConditionの設定 Condition scanFilterCondition = new Condition() .withComparisonOperator(ComparisonOperator.EQ.toString()) .withAttributeValueList(new AttributeValue().withS("Book 500"));
以下はComparisonOperatorのJavaDoc
[http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodb/model/ComparisonOperator.html:title=
http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodb/model/ComparisonOperator.html]