簡體   English   中英

Spark Scala使用廣播變量拋出“ java.util.NoSuchElementException:找不到密鑰”

[英]Spark Scala throws “java.util.NoSuchElementException: key not found” with Broadcast variable

我有一個廣播變量,其構造如下

// Function
def loadMovieNames(sparkContext: SparkContext): Map[Int, String] = {

    // Handle character encoding issues:
    implicit val codec = Codec("UTF-8")
    codec.onMalformedInput(CodingErrorAction.REPLACE)
    codec.onUnmappableCharacter(CodingErrorAction.REPLACE)

    // Create a Map of Ints to Strings, and populate it from u.item.
    var movieNames: Map[Int, String] = Map()

    val lines = sparkContext.textFile("s3a://bucket/movies.dat")
    for (line <- lines) {
        var fields = line.split("::")
        if (fields.length > 1) {
        movieNames += (fields(0).toInt -> fields(1))
        }
    }

    return movieNames
}

// Main
val nameDict = loadMovieNames(spark.sparkContext)
val broadcastNames = spark.sparkContext.broadcast(nameDict)

以下是main中用於訪問廣播變量的代碼。

val resultDF = recommendationsDF.sort($"score".desc).limit(30)

val check = (id1: Int, id2: Int) => if (id1 == movie) broadcastNames.value(id2) else broadcastNames.value(id1)

val getName = udf(check)

val results = resultDF.withColumn("movie", getName($"movieId1", $"movieId2"))

results.show(30)

但是,當我稍后嘗試在main中的廣播變量中進行查找時,出現以下異常。

Caused by: java.util.NoSuchElementException: key not found: 1196
at scala.collection.MapLike$class.default(MapLike.scala:228)
at scala.collection.AbstractMap.default(Map.scala:59)
at scala.collection.MapLike$class.apply(MapLike.scala:141)
at scala.collection.AbstractMap.apply(Map.scala:59)
at com.spark.movierec.MovieRecDF$$anonfun$5.apply(MovieRecDF.scala:144)
at com.spark.movierec.MovieRecDF$$anonfun$5.apply(MovieRecDF.scala:143)

最初遇到相同問題時,我將Map轉換為廣播變量。 閱讀這個問題的答案之后在這里 ,我已經意識到這可能是與封閉的問題。 但是我仍然不確定如何解決這個問題。

創建本地地圖的一種方法是使用collectAsMap

val nameDict = sparkContext.broadcast(sparkContext
  .textFile(path)
  .map(_.split("::"))
  .filter(_.size > 1)
  .map(arr => (arr(0).toInt, arr(1)))
  .collectAsMap())

您還應該考慮使用DataFrames和廣播DataFrames來代替UDF和廣播變量,但是應用程序的邏輯尚不清楚。

暫無
暫無

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

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