我正在使用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必须通过什么样的结构才能通过这段代码?
再一次,也许我只是说错了。有什么建议吗?
答案 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
在不同的屏幕中