前回Node.jsのLambdaでdynamoDBのクエリを実行しました。
pythonでも確認しましたのでメモ。
DynamoDBのQueryの制限
DynamoDBのクエリで取得可能なデータは最大1MBの制限があります。
フィルタ式でデータを間引こうと考えましたが、フィルタはクエリ後に適用なので効果がありませんでした。
DynamoDB での制限 – API 固有の制限
https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/Limits.html#limits-api
LastEvaluatedKey と ExclusiveStartKey
そのため全データを抽出するにはクエリを複数回実行する必要があります。
responseに LastEvaluatedKey が含まれている場合、まだクエリしきれないデータがありますので、ExclusiveStartKey をセットしてクエリを繰り返すことで全データをクエリできます。
コード
# -*- coding: utf-8 -*-
from __future__ import print_function
import boto3
from boto3.dynamodb.conditions import Key, Attr
dynamodb = boto3.resource('dynamodb')
TABLE_NAME = 'test_table'
device_id = 'zoe6120'
def dynamo_db_query():
table = dynamodb.Table(TABLE_NAME)
response = table.query(
KeyConditionExpression=Key('deviceid').eq(device_id) & Key('timestamp').between('2017-03-10', '2019-03-14'),
FilterExpression=Attr('test_timestamp').contains('2019'))
ret_data = response['Items']
while 'LastEvaluatedKey' in response:
response = table.query(
KeyConditionExpression=Key('deviceid').eq(device_id) & Key('timestamp').between('2017-03-10', '2019-03-14'),
FilterExpression=Attr('test_timestamp').contains('2019'),
ExclusiveStartKey=response['LastEvaluatedKey'])
ret_data += response['Items']
return ret_data
if __name__ == '__main__':
items = dynamo_db_query()
print(items)
Lambda環境だけでなく、ローカルマシンでもaws cliとbotoをインストールしていれば実行できます。
参考:
公式doc: ステップ 4: データをクエリおよびスキャンする
https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/GettingStarted.Python.04.html
関連記事
PythonでDynamoDBのQueryを実行してCSVへ出力する
AWS LambdaからNode.jsでDynamoDBのクエリを実行する。
AWS dynamoDB のキーに予約語timestampを使用している場合のCLIからのquery