[英]What is wrong with this Spark RDD mapped with a lambda function with two arguments?
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)
我相信具有多個參數的 lambda 的正確語法是:
sum_function = lambda a, b: a + b
請注意缺少的括號。 如果您嘗試將一個元組映射到另一個元組,則需要執行以下操作:
lambda tup: (nameDict.value[tup[1]], tup[0])
Python 函數不會自動解包元組,因此多參數函數不會接受元組作為其參數並使其正常工作(當然,這就是 * 運算符的用途)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.