sortedMoviesWithNames = sortedMovies.map(lambda (count, movie) :
(nameDict.value[movie], count))
此代码示例摘自Apache Spark和Python的食谱。所有其他编码练习都可以在我的环境中完美运行。 Windows 10 / Canopy / Python 3.5 / Spark 2.3.2
我已经检查了广播词典的内容,并且已经打印了sortedMovies RDD,这也可以。我已经检查了这本书的在线勘误表,也没有。
我想知道这是否是由于Python版本或类似原因引起的语法错误。
from pyspark import SparkConf, SparkContext
def loadMovieNames():
movieNames = {}
with open("ml-100k/u.item") as f:
for line in f:
fields = line.split('|')
movieNames[int(fields[0])] = fields[1]
return movieNames
conf = SparkConf().setMaster("local").setAppName("PopularMovies")
sc = SparkContext(conf = conf)
nameDict = sc.broadcast(loadMovieNames())
lines = sc.textFile("file:///SparkCourse/ml-100k/u.data")
movies = lines.map(lambda x: (int(x.split()[1]), 1))
movieCounts = movies.reduceByKey(lambda x, y: x + y)
flipped = movieCounts.map(lambda x: (x[1], x[0]))
sortedMovies = flipped.sortByKey()
sortedMoviesWithNames = sortedMovies.map(lambda (count, movie) :
(nameDict.value[movie], count))
results = sortedMoviesWithNames.collect()
for result in results:
print(result)
答案 0 :(得分:1)
我相信带有多个参数的lambda的正确语法是:
sum_function = lambda a, b: a + b
请注意缺少的括号。 如果您试图将一个元组映射到另一个元组,则需要执行以下操作:
lambda tup: (nameDict.value[tup[1]], tup[0])
Python函数不会自动解压缩元组,因此多参数函数将不接受其元组的参数并使其正常工作(当然,这就是*运算符的作用)。