【发布时间】:2017-09-30 20:14:31
【问题描述】:
我正在使用 Hadoop/MapReduce 构建电影推荐。
现在我只使用 python 来实现 MapReduce 过程。
所以我基本上做的是分别运行每个映射器和减速器,并使用从映射器到减速器的控制台输出。
我遇到的问题是 python 在终端中将值输出为字符串,所以如果我使用数字,数字将打印为字符串,这使得简化过程变得困难,因为它的转换增加了更多加载到服务器上。
那么我该如何解决这个问题,我希望使用纯 python 来实现它,而不是使用 3rd-party 库。
import sys
def mapper():
'''
From Mapper1 : we need only UserID , (MovieID , rating)
as output.
'''
#* First mapper
# Read input line
for line in sys.stdin:
# Strip whitespace and delimiter - ','
print line
data = line.strip().split(',')
if len(data) == 4:
# Using array to print out values
# Direct printing , makes python interpret
# values with comma in between as tuples
# tempout = []
userid , movieid , rating , timestamp = data
# tempout.append(userid)
# tempout.append((movieid , float(rating)))
# print tempout
#
print "{0},({1},{2})".format(userid , movieid , rating)
这是 reducer 打印语句:
def reducer():
oldKey = None
rating_arr = []
for line in sys.stdin:
# So we'll recieve user, (movie,rating)
# We need to group the tuples for unique users
# we'll append the tuples to an array
# Given that we have two data points , we'll split the
# data at only first occurance of ','
# This splits the string only at first comma
data = line.strip().split(',',1)
# print len(data) , data
# check for 2 data values
if len(data) != 2:
continue
x , y = data
if oldKey and oldKey != x:
print "{0},{1}".format(oldKey , rating_arr)
oldKey = x
rating_arr = []
oldKey = x
rating_arr.append(y)
# print rating_arr
if oldKey != None:
print "{0},{1}".format(oldKey , rating_arr)
`
输入是:
671,(4973,4.5)\n671,(4993,5.0)\n670,(4995,4.0)
输出是:
671,['(4973,4.5)', '(4993,5.0)']
670,['(4995,4.0)']
我需要元组,没有字符串。
【问题讨论】:
-
Python 不会自动将列表中的元组转换为字符串,看来您的问题出在上游。
-
这里有很多缺失的代码。没有它,我们就没有多大用处。
-
请检查更新后的代码
-
请显示你想要的输出
-
@cricket_007 元组的值被转换为字符串。 ,我需要整数值
标签: python hadoop mapreduce hadoop-streaming