簡體   English   中英

如何在 Scala 中查看 RDD.join() 的結果?

[英]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.

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