3

我正在使用 boto 访问 dynamodb 表。一切都很顺利,直到我尝试执行扫描操作。

在反复搜索 Internet 后,我​​尝试了几种语法,但没有运气:

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

好的,看起来我遇到了导入问题。只需使用:

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 回答