这是我在 Coursera 上做的数据科学课程中的硬件任务的求助电话,因为我无法在 Coursera 论坛上获得任何建议。我已经编写了代码,但不幸的是输出没有返回预期的结果。这是手头的问题:
任务:将关系连接实现为 MapReduce 查询
输入(映射器):
输入将是格式化为字符串列表的数据库记录。每个列表元素对应于其对应记录中的不同字段。每条记录中的第一项(索引 0)是一个字符串,用于标识该记录来自哪个表。该字段有两个可能的值:
- 'line_item' 表示该记录是一个行项目。2.'order'表示该记录是一个订单。
每条记录中的第二个元素(索引 1)是 order_id。LineItem 记录有 17 个元素,包括标识符字符串。订单记录有 10 个元素,包括标识符字符串。
输出(减速机):
输出应该是一个连接的记录。
结果应该是一个长度为 27 的列表,其中包含来自订单记录的字段,后跟来自行项目记录的字段。每个列表元素都应该是一个字符串。
我的代码是:
import MapReduce
import sys
"""
Word Count Example in the Simple Python MapReduce Framework
"""
mr = MapReduce.MapReduce()
# =============================
# Do not modify above this line
record = open(sys.argv[1]) # this read input, given by instructor
def mapper(record):
key = record[1] # assign order_id from each record as key
value = list(record) # assign whole record as value for each key
mr.emit_intermediate(key, value) # emit key-value pairs
def reducer(key, value):
new_dict = {} # create dict to keep track of records
if not key in new_dict:
new_dict[key] = value
else:
new_dict[key].extend(value)
for key in new_dict:
if len(new_dict[key]) == 27:
mr.emit(new_dict[key])
# Do not modify below this line
# =============================
if __name__ == '__main__':
inputdata = open(sys.argv[1])
mr.execute(inputdata, mapper, reducer)
我收到的错误消息是“预期:31 条记录,得到 0”。
此外,预期的输出记录应该是这样的——只有一个列表,所有记录集中在一起,没有任何重复数据删除。
["order", "5", "44485", "F", "144659.20", "1994-07-30", "5-LOW", "Clerk#000000925", "0", "quickly. bold deposits sleep slyly. packages use slyly", "line_item", "5", "37531", "35", "3", "50", "73426.50", "0.08", "0.03", "A", "F", "1994-08-08", "1994-10-13", "1994-08-26", "DELIVER IN PERSON", "AIR", "eodolites. fluffily unusual"]
很抱歉问题很长,而且有点乱,但我希望答案对某人来说是显而易见的。
对我有用的类似代码:
def mapper(record):
# key: document identifier
# value: document contents
friend = record[0]
value = 1
mydict = {}
mr.emit_intermediate(friend, value)
mydict[friend] = int(value)
def reducer(friend, value):
# key: word
# value: list of occurrence counts
newdict = {}
if not friend in newdict:
newdict[friend] = value
else:
newdict[friend] = newdict[friend] + 1
for friend in newdict:
mr.emit((friend, (newdict[friend])))
谢谢!谢尔盖