首页 > 解决方案 > 这个使用带有两个参数的 lambda 函数映射的 Spark RDD 有什么问题?

问题描述

目标#

数据

方法

问题

此代码示例来自 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)

标签: pythonlambdapysparkrdd

解决方案


我相信具有多个参数的 lambda 的正确语法是:

sum_function = lambda a, b: a + b

注意缺少的括号。如果您尝试将一个元组映射到另一个元组,则需要执行以下操作:

lambda tup: (nameDict.value[tup[1]], tup[0])

Python 函数不会自动解包元组,因此多参数函数不会接受元组作为其参数并使其正常工作(当然,这就是 * 运算符的用途)。


推荐阅读