繁体   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