当show()快速运行时,Spark collect()/ count()永远不会完成

时间:2017-10-20 16:56:40

标签: scala apache-spark gradle

我在Mac上本地运行Spark并且存在一个奇怪的问题。基本上,我可以使用DataFrame的show()方法输出任意数量的行,但是,当我尝试使用count()或collect()时,即使是非常少量的数据,Spark也会卡在那个阶段。永远不会完成它的工作。我使用gradle进行构建和运行。

当我跑步时

./gradlew clean run

程序陷入

> Building 83% > :run

什么可能导致这个问题? 这是代码。

    val moviesRatingsDF = MongoSpark.load(sc).toDF().select("movieId", "userId","rating")

    val movieRatingsDF = moviesRatingsDF
      .groupBy("movieId")
      .pivot("userId")
      .max("rating")
      .na.fill(0)

    val ratingColumns = movieRatingsDF.columns.drop(1) // drop the name column

    val movieRatingsDS:Dataset[MovieRatingsVector] = movieRatingsDF
      .select( col("movieId").as("movie_id"), array(ratingColumns.map(x => col(x)): _*).as("ratings") )
      .as[MovieRatingsVector]

    val moviePairs = movieRatingsDS.withColumnRenamed("ratings", "ratings1")
      .withColumnRenamed("movie_id", "movie_id1")
      .crossJoin(movieRatingsDS.withColumnRenamed("ratings", "ratings2").withColumnRenamed("movie_id", "movie_id2"))
      .filter(col("movie_id1") < col("movie_id2"))

    val movieSimilarities = moviePairs.map(row => {
      val ratings1 = sc.parallelize(row.getAs[Seq[Double]]("ratings1"))
      val ratings2 = sc.parallelize(row.getAs[Seq[Double]]("ratings2"))
      val corr:Double = Statistics.corr(ratings1, ratings2)

      MovieSimilarity(row.getAs[Long]("movie_id1"), row.getAs[Long]("movie_id2"), corr)
    }).cache()


    val collectedData = movieSimilarities.collect()
    println(collectedData.length)

    log.warn("I'm done") //never gets here

    close

enter image description here

1 个答案:

答案 0 :(得分:-1)

Spark执行延迟评估并在调用操作时创建rdd / df。

回答你的问题

1.在收集/计数中,您正在调用两个不同的操作,如果您正在调用  因此,不会持久化数据,这将导致RDD / df被重新评估  比预期更多的时间。

  1. 在节目中只有一个动作。它只显示前1000行(手指交叉 )因此它结束了