无法使用dynamodb扫描与boto一起工作

时间:2012-09-30 19:29:06

标签: boto amazon-dynamodb

我正在使用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必须通过什么样的结构才能通过这段代码?

再一次,也许我只是说错了。有什么建议吗?

2 个答案:

答案 0 :(得分:4)

好的,看起来我有一个导入问题。只需使用:

import boto

并指定boto.dynamodb.condition不会削减它。我不得不补充道:

import dynamodb.condition

获取条件类型以获取。我现在正在使用的代码是:

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

不是我完全理解为什么,但它现在对我有用。 : - )

答案 1 :(得分: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

在不同的屏幕中