[英]How can you view the result of RDD.join() in Scala?
我正在嘗試計算 PageRanking 算法的結果,其中評分函數是頁面上傳出鏈接的數量。
val links = warcs.map{ wr => wr._2.getRecord()}.
map{ wb => {
val url = wb.getHeader().getUrl()
val d = Jsoup.parse(wb.getHttpStringBody())
val links = d.select("a").asScala
links.map(l => (url,l.attr("href"))).toIterator
}
}.
flatMap(identity).map(t => (t._1,List(t._2))).reduceByKey(_:::_)
var ranks = warcs.map{ wr => wr._2.getRecord()}.
map{ wb => (wb.getHeader().getUrl(), Jsoup.parse(wb.getHttpStringBody()).select("a[href]").size())}.
filter{ l => l._2 > 0}
鏈接 RDD 的形式是(URL,傳出 URL 列表),排名是形式(URL,傳出 URL 的數量)。
這是頁面排名的樣子:
for(i <- 1 to 10){
val contribs = links.join(ranks).flatMap { case (url, (links, rank)) => links.map(dest => (dest, rank/links.size)) }
ranks = contribs.reduceByKey((x,y) => x+y).mapValues(sum => (0.15 + 0.85*sum).toInt)
}
話雖如此,當我嘗試檢查排名算法的結果時,遇到了 IndexOutOfBoundsException。 我嘗試通過打印ranks.isEmpty()
查看生成的RDD 是否為空,我得到了同樣的異常。
出於好奇,我嘗試查看links.join(ranks)
的結果,但同樣的異常再次發生。
join() 操作出了什么問題,我該如何進行?
原來問題出在我正在使用的 WARC 文件的創建中,
val warcs = sc.newAPIHadoopFile(
warcfile,
classOf[WarcGzInputFormat], // InputFormat
classOf[NullWritable], // Key
classOf[WarcWritable] // Value
).cache()
原來刪除.cache()
停止異常。 我不知道為什么,所以仍然歡迎解釋。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.