【问题标题】:What is wrong with this Spark RDD mapped with a lambda function with two arguments?这个使用带有两个参数的 lambda 函数映射的 Spark RDD 有什么问题?
【发布时间】: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 lambda pyspark rdd


【解决方案1】:

我认为具有多个参数的 lambda 的正确语法是:

sum_function = lambda a, b: a + b

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

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

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

【讨论】:

  • 感谢您提供快速而良好的答案。 sortedMoviesWithNames = sortedMovies.map(lambda moviesDim : (nameDict.value[moviesDim[1]], moviesDim[0])) 效果很好!
猜你喜欢
  • 2022-11-01
  • 2018-11-16
  • 1970-01-01
  • 2011-04-16
  • 2017-03-26
  • 1970-01-01
  • 2012-12-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多