DynamoDBテーブルをクエリ/スキャンする方法
Contents
DynamoDBテーブルからレコードを抽出したい
びっくり。DynamoDBのコンソールは検索に弱い…
- DynamoDBで多くのレコードが登録されたテーブルの場合、AWSコンソールから条件を指定してフィルターしても検索が中断されてしまい、検索結果が表示されないことが分かりました。残念、コンソールでは多くのレコードを持つテーブルでのレコード検索ができませんでした!(驚
- 次に、AWS CLI を使い、テーブルをscanして安易に全レコードをファイルにリダイレクトしましたが時間が掛かり…、効率的ではありませんでした(汗
DynamoDBのテーブルをクエリする
- 次にドキュメントを読みながら、テーブルのクエリを行います。初めてのクエリで複雑な指定に戸惑いましたが、KeyConditionsを指定することでレコードの条件が指定できます。以下ドキュメントに、aws dynamodb query –key-conditionsoおよび–key-condition-expressionオプションを使った場合の2パターンのサンプルが記載されていました。参考になります。
- しかし、試行錯誤しますがValidationExceptionのエラーが出力されます。悩んだ結果、私が作成したテーブルの場合、等しい(EQ)の条件は結果が出力されますが、以下・未満・以上・より大きい(LE・LT・GE・GT)の条件がエラーになることが分かりました。
$ aws dynamodb query \
> --table-name dyn-table01 \
> --key-conditions '{
> "employeeId":{
> "ComparisonOperator":"EQ",
> "AttributeValueList": [ {"S": "A12345"} ]
> },
> "timeStamp":{
> "ComparisonOperator":"EQ",
> "AttributeValueList": [ {"S": "201906"} ]
> }
> }'
{
"Items": [],
"Count": 0,
"ScannedCount": 0,
"ConsumedCapacity": null
}
$ aws dynamodb query \
> --table-name dyn-table01 \
> --key-conditions '{
> "employeeId":{
> "ComparisonOperator":"EQ",
> "AttributeValueList": [ {"S": "A12345"} ]
> },
> "timeStamp":{
> "ComparisonOperator":"GE",
> "AttributeValueList": [ {"S": "201906"} ]
> }
> }'
An error occurred (ValidationException) when calling the Query operation: Query key condition not supported
- 原因となるヒントは、下記のブログに記載されていました。クエリは諦めた方が良さそうです。
https://blog.brains-tech.co.jp/entry/2015/09/30/222148
DynamoDBのテーブルをスキャンしてフィルターする
- クエリからスキャンに変更して実行することができました。以下、scanにfilterオプションを使ってレコードを抽出するサンプルです。
- filter-expressionの指定方法が初見では分かり辛いため、下記コマンド指定を参考にしてください。
$ aws dynamodb scan --table-name dyn-table01 --filter-expression '#a = :1 and #b >= :2' --expression-attribute-values '{ ":1": { "S": "A12345" }, ":2": { "S": "201907" } }' --expression-attribute-names '{"#a": "employeeId", "#b": "timeStamp"}'
まとめ
- DynamoDBのScanは、常にテーブル全体がスキャンされるため負荷が大きい。一方、Queryは、特定の範囲のキーだけが検索されるため負荷が小さい。
- Queryはプライマリキーの属性値だけが検索されるのに対して、Scanではテーブル内のすべての項目を検索する事が可能。いつもQueryを使って検索できることが望ましいが、テーブル構造上Scanを使わなければいけないこともある。