DynamoDBテーブルをクエリ/スキャンする方法

7月 3, 2019AWS,DynamoDB

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を使わなければいけないこともある。

AWS,DynamoDB

Posted by takaaki