3

botoを使用してdynamodbテーブルにアクセスしています。スキャン操作を実行しようとするまで、すべてが順調でした。

インターネットを繰り返し検索した後で見つけた構文をいくつか試しましたが、うまくいきませんでした。

def scanAssets(self, asset):
    results = self.table.scan({('asset', 'EQ', asset)})
         -or-
    results = self.table.scan(scan_filter={'asset':boto.dynamodb.condition.EQ(asset)})

私がスキャンしている属性は「アセット」と呼ばれ、アセットは文字列です。

奇妙なことに、table.scan呼び出しは、常にこの関数を通過することになります。

def dynamize_scan_filter(self, scan_filter):
    """
    Convert a layer2 scan_filter parameter into the
    structure required by Layer1.
    """
    d = None
    if scan_filter:
        d = {}
        for attr_name in scan_filter:
            condition = scan_filter[attr_name]
            d[attr_name] = condition.to_dict()
    return d

私はPythonの専門家ではありませんが、これがどのように機能するかわかりません。つまり、このコードを通過するには、scan_filterはどのような構造である必要がありますか?

繰り返しますが、多分私はそれを間違っていると言っています。助言がありますか?

4

2 に答える 2

4

OK、インポートに問題があったようです。単に使用する:

import boto

boto.dynamodb.conditionを指定しても、それはカットされません。追加する必要がありました:

import dynamodb.condition

取得する条件タイプを取得します。私の現在機能しているコードは次のとおりです。

results = self.table.scan(scan_filter={'asset': dynamodb.condition.EQ(asset)})

理由を完全に理解しているわけではありませんが、今はうまくいっています。:-)

于 2012-10-02T14:45:50.677 に答える
0

またはあなたはこれを行うことができます

exclusive_start_key = None
while True:
    result_set = self.table.scan(
        asset__eq=asset,  # The scan filter is explicitly given here
        max_page_size=100,  # Number of entries per page
        limit=100,
        # You can divide the table by n segments so that processing can be done parallelly and quickly.
        total_segments=number_of_segments,
        segment=segment,  # Specify which segment you want to process
        exclusive_start_key=exclusive_start_key  # To start for last key seen
    )
    dynamodb_items = map(lambda item: item, result_set)
    # Do something with your item, add it to a list for later processing when you come out of the while loop
    exclusive_start_key = result_set._last_key_seen
    if not exclusive_start_key:
         break

これはどの分野にも当てはまります。

セグメンテーション:test.pyに上記のスクリプトがあるとします

あなたはのように並行して実行することができます

python test.py --segment=0 --total_segments=4
python test.py --segment=1 --total_segments=4
python test.py --segment=2 --total_segments=4
python test.py --segment=3 --total_segments=4

さまざまな画面で

于 2017-05-31T11:20:29.897 に答える