AWS DynmoDB ScanIndexForward読出しで0件!?

ちょっとマニアックで癖のあるAWS DynmoDB。

時系列のログなどは、降順で読み出したいところです。pythonでは以下のようなコードになるかと思います。ScanIndexForwardを指定します。

tbl1 = dynamodb.Table("テーブル名")
   :
   :
resp = tbl1.query(
          KeyConditionExpression=Key('キー名').eq('キー値'),
          ScanIndexForward=False
       )

しかし実際には、query一回の読出し量1MBの制約があります。1MBオーバのエラー検出をして、再読み込みさせるコードを書くなら、以下のように予め一定件数づつ読出しした方が効率的です。

resp = tbl1.query(
          KeyConditionExpression=Key('キー名').eq('キー値'),
          ScanIndexForward=False,
          Limit=1000
       )

当方では、以下のようにプライマリキーは、時刻を入れていました。

登録時刻(プライマリキー)データ1データ2データ3

こうすると、一番新しい時刻から、1000件が降順で読み出されると考えてしまいます。

しかし実際には、読出し件数は、0となってしまいました!!

どうも「一番古いデータから、降順で1,000件」というリクエストと解釈されるようです。

当方では、以下のように対処しました。

resp = tb1.query(
          KeyConditionExpression=Key('キー名').eq('キー値') & Key('時刻').lt('最新時刻'),
                   Limit=1000,
                   ScanIndexForward=False 
           )

‘最新時刻’は、弊方はデータに登録されている現在を用いましたが、現在時刻でもいけるのか未確認です。記録時刻の最大を求めたい場合は、 他RDBでSQL文ですとMAX関数で一発でもとまりますが、Dynamodbでは全件なめにいきそうな気配です。また1MB問題にひっかかりそうですね。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です