【发布时间】:2018-12-26 21:32:29
【问题描述】:
目标#
- 打印包含电影名称和评分次数的数据集。
- 这是获得最“流行”电影的简单方法
数据
- 一个名为“u.data”的文件,其中包含电影 ID、用户 ID、评级、时间戳
- 一个名为“u.item”的文件,其中包含电影 ID 和电影名称以及有关 - 每部电影的信息
方法
- 从 u.item 文件创建字典键 = MovieID,值 = 名称
- 将字典广播到集群上的刽子手节点
- 使用 MovieID 和每行 1 创建一个 rdd
- 将此 rdd 减为movieID 并对每一个求和
- 翻转键(movieID)和值(总计)以按此总计对数据集进行排序
问题
- 然后我应该将movieID 与广播的字典进行映射,但在这一行出现语法错误:
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)
【问题讨论】:
-
这可能是已从 Python 3 中删除的“元组参数解包”的情况(请参阅Nested arguments not compiling)。
-
就是这样。谢谢。我在对上一个答案的评论中写下了正确的语法。