share facebook facebook2 twitter menu hatena pocket slack

2016.01.04 MON

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

鈴木 宏康

WRITTEN BY鈴木 宏康

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

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

2015-11-06_04-44-35

そこからランダムな100件のリストを作成したいと思います。
要件は下記とします。

  • レコード数はそれほど多くない(全件取得してもLambda内で処理できる)
  • レコード数が100件未満の場合もあるため、リストの値は重複OK

で、Python(Lambda)で楽にできないかなー、とググってたら、いい記事見つけました。

“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"
    },
    ...
]

元記事はこちら

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

鈴木 宏康

鈴木 宏康

愛知県生まれ。東京工業大学大学院修士課程修了。在学時より、ベンチャー企業でインターネットに関する業務に携わり、現在はクラウド(主にAmazon Web Services)上での開発・運用を軸とした事業の、業務の中心として活躍。