我在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
答案 0 :(得分:-1)
Spark执行延迟评估并在调用操作时创建rdd / df。
回答你的问题
1.在收集/计数中,您正在调用两个不同的操作,如果您正在调用 因此,不会持久化数据,这将导致RDD / df被重新评估 比预期更多的时间。