2015年11月6日金曜日

DynamoDBのテーブルからランダムにレコードを取得する(全件とってからの処理なので良い実装ではないけど...)


全件とってからの処理なので良い実装ではないけど、場合によっては使えるので、
TIPSを貯める目的として...

DynamoDBのテーブルは、こんなシンプルな感じで、

そこからランダムな100件のリストを作成したいと思います。
要件は下記とします。
  • レコード数はそれほど多くない(全件取得してもLambda内で処理できる)
  • レコード数が100件未満の場合もあるため、リストの値は重複OK
で、Python(Lambda)で楽にできないかなー、とググってたら、いい記事見つけました。
Python Tips:リストの中から要素をランダムにピックアップしたい
"random.choice(リスト)"っていうのを使うと、リスト中の値から、
ランダムに一件を取得できるようです。

ということで、コード(Lambda)は下記のとおりです。
(余計な処理も入ってますが...)
import logging
import random
import boto3

image_url = "http://xxxxxxxxxxxxxx.cloudfront.net/"

def lambda_handler(event, context):

    logger = logging.getLogger()
    logger.setLevel(logging.INFO)

    try:

        logger.info(event)
        table = boto3.resource("dynamodb").Table("image")

        response = table.scan()
        logger.info(response)

        items = []
        if response["Count"] != 0:
            for i in range(0, 100):
                id = random.choice(response["Items"])["id"]
                items.append({ "id": id, "url": image_url + id + ".png"})
        logger.info(items)

        return items

    except Exception as e:
        logger.error(e)
        raise e

上記を実行すると、次のようなDynamoDBのテーブルのレコードから、
100件ランダムに取得した(重複あり)リストを作成することができました。
[
    {
        "url": "http://xxxxxxxxxxxxxx.cloudfront.net/fa4ee1f2838b11e59f9436cb5329c05c.png",
        "id": "fa4ee1f2838b11e59f9436cb5329c05c"
    },
    {
        "url": "http://xxxxxxxxxxxxxx.cloudfront.net/436f0c8c838b11e59f9436cb5329c05c.png",
        "id": "436f0c8c838b11e59f9436cb5329c05c"
    },
    ...
]

0 コメント: