我正在尝试使用来自数据操作的数字操作与Cthon的系统和算法进行家庭分配。一般来说,我在理解基本代码方面存在问题,而基本代码是作为MapReduce alogorythm的一个例子而呈现的。我将很高兴帮助我在2个地方了解它,详情如下。
我厌倦了在运行命令后逐步执行以下两个文件的代码流程:
python wordcount.py 'data/books.json'
wordcount.py
已打开mr = MapReduce.MapReduce()
- 我创建了对象def __init__(self):
的MapReduce.py
部分是
执行wordcount.py
def mapper(record):
和def reducer(key,list_of_values):
但暂时不执行if __name__ == '__main__':
mr.execute(inputdata, mapper, reducer)
- 从MapReduce.py
调用该函数。这是我的第一个问题,到目前为止我们还没有定义映射器或reducer变量/对象。它只是null /没有传递给这个函数的值,或者我们之前以某种方式定义了这个变量但我错过了这个?
def execute(self, data, mapper, reducer):
MapReduce.py
mapper(record)
。所以这是对wordcount.py中函数的引用,对不对?但是如果我们在不同的文件中引用一个函数,我们不应该在文件的开头使用import并定义这个函数来自哪个文件?
(...)进一步执行代码
wordcount.py文件:
import MapReduce
import sys
"""
Word Count Example in the Simple Python MapReduce Framework
"""
mr = MapReduce.MapReduce()
# =============================
# Do not modify above this line
def mapper(record):
# key: document identifier
# value: document contents
key = record[0]
value = record[1]
words = value.split()
for w in words:
mr.emit_intermediate(w, 1)
def reducer(key, list_of_values):
# key: word
# value: list of occurrence counts
total = 0
for v in list_of_values:
total += v
mr.emit((key, total))
# Do not modify below this line
# =============================
if __name__ == '__main__':
inputdata = open(sys.argv[1])
mr.execute(inputdata, mapper, reducer)
MapReduce.py文件:
import json
class MapReduce:
def __init__(self):
self.intermediate = {}
self.result = []
def emit_intermediate(self, key, value):
self.intermediate.setdefault(key, [])
self.intermediate[key].append(value)
def emit(self, value):
self.result.append(value)
def execute(self, data, mapper, reducer):
for line in data:
record = json.loads(line)
mapper(record)
for key in self.intermediate:
reducer(key, self.intermediate[key])
#jenc = json.JSONEncoder(encoding='latin-1')
jenc = json.JSONEncoder()
for item in self.result:
print jenc.encode(item)
提前感谢您的帮助。
答案 0 :(得分:1)
在python中,一切都是一个对象,包括函数,所以你可以将一个functionA作为参数传递给另一个函数B(或类或任何时候),如果functionB希望你这样做,它会假设你给它一个与正确的公司合作,并按正常方式进行。
在你的情况下
mapper
此处reducer
,execute
是先前定义的函数,它们作为参数传递给类mr
的实例MapReduce
的方法map
并且如您所见,所述方法将其用作预期的功能。
感谢你,你可以像代码所示那样制作一些通用代码,通过给用户提供他/她自己的功能的选项,可以通过许多应用程序以类似的方式使用某些微积分。
一个更为通用的例子是函数php artisan generate:seed Houses
,这个函数接收一个函数做某事,映射不关心它做什么或它来自何处,只接收与地图自己接收(其他说功能)并返回一个值来构建一个包含结果的新列表。