python - 这个使用带有两个参数的 lambda 函数映射的 Spark RDD 有什么问题?
问题描述
目标#
- 打印带有电影名称和评分次数的数据集。
- 这是获得最“流行”电影的简单方法
数据
- 一个名为“u.data”的文件,其中包含电影 ID、用户 ID、评级、时间戳
- 一个名为“u.item”的文件,其中包含电影 ID 和电影名称以及关于 - 每部电影的信息
方法
- 从 u.item 文件创建字典键 = MovieID,值 = 名称
- 将字典广播到集群上的执行者节点
- 在每行创建一个带有 MovieID 和 1 的 rdd
- 通过movieID减少这个rdd并将每个相加
- 翻转键(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)
解决方案
我相信具有多个参数的 lambda 的正确语法是:
sum_function = lambda a, b: a + b
注意缺少的括号。如果您尝试将一个元组映射到另一个元组,则需要执行以下操作:
lambda tup: (nameDict.value[tup[1]], tup[0])
Python 函数不会自动解包元组,因此多参数函数不会接受元组作为其参数并使其正常工作(当然,这就是 * 运算符的用途)。
推荐阅读
- c# - 如何在 ASP.NET CORE 2.2 中将变量从表单传递到 ajax
- mongodb - 如何从 MongoDB 集合中的文档中提取前 n 个元素?
- python - Python2中的非阻塞“等待按键”功能
- azure - 通过 Kubernetes 挂载卷时 Neo4j 关闭
- docker - 用于离线镜像的 Docker DCT
- cakephp - 如何保存重复记录使用belongsToMany?
- javascript - Service Worker 只显示第一个推送通知(来自云消息传递),直到我重新加载 - 消息已被工作人员收到
- javascript - 如何在javascript中的第n个点之前获取子字符串
- html - 如何使溢出的文本朝一个方向移动而不是使其隐藏
- javascript - Ext.msg.Alert 在中心对齐文本消息