簡體   English   中英

這個用帶有兩個參數的 lambda 函數映射的 Spark RDD 有什么問題?

[英]What is wrong with this Spark RDD mapped with a lambda function with two arguments?

目標#

  • 打印帶有電影名稱和評分次數的數據集。
  • 這是獲得最“流行”電影的簡單方法

數據

  • 一個名為“u.data”的文件,其中包含電影 ID、用戶 ID、評級、時間戳
  • 一個名為“u.item”的文件,其中包含電影 ID 和電影名稱以及每部電影的相關信息

方法

  • 從 u.item 文件創建一個字典鍵 = MovieID,值 = 名稱
  • 將字典廣播到集群上的執行者節點
  • 使用 MovieID 和每行 1 創建一個 rdd
  • 通過movieID減少這個rdd並總結每個
  • 翻轉鍵(電影ID)和值(總計)以按此總計對數據集進行排序

問題

  • 然后我應該將 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 函數不會自動解包元組,因此多參數函數不會接受元組作為其參數並使其正常工作(當然,這就是 * 運算符的用途)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM