云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

免备案CDN_域名解析暂时失败_0元

小七 141 0

在国会图书馆主题库SKOS上运行apachesparkgraphx算法

鲍勃·阿姆是这里的客人。原文发表于:好吧,一种算法,但很酷。上个月,在apachespark和SPARQL;RDF Graphs和GraphX中,我描述了apachespark如何成为MapReduce的一个更有效的替代方案,用于跨集群分布计算作业。我还描述了Spark的GraphX库如何让您在图数据结构上进行这种计算,以及如何对RDF数据使用它提出一些想法。我的目标是在GraphX数据上使用RDF技术,反之亦然,以演示它们是如何互相帮助的,我用Scala程序演示了前者,该程序将一些GraphX数据输出为RDF,然后显示了一些SPARQL查询在该RDF上运行。今天,我通过读取一个著名的RDF数据集并在其上执行GraphX的connectedcomponents算法来演示后者。该算法将节点收集到相互连接但不连接到任何其他节点的分组中。在经典的大数据场景中,这有助于应用程序执行任务,例如识别更大网络中的人的子网,根据朋友喜欢的内容,提供关于哪些产品或cat视频建议给这些人的线索。美国国会图书馆自1898年以来一直致力于他们的主题标题元数据,它可以在SKOS RDF中获得。许多主题都包含"相关"值;例如,您可以看到主题鸡尾酒具有鸡尾酒会和快乐时光的相关值,而"快乐时光"具有酒吧(酒馆)、餐厅和鸡尾酒的相关值。所以,虽然它包括skos:相关三元组间接地将鸡尾酒与餐厅联系起来,却没有将其与空间站的主题联系起来,因此空间站主题与鸡尾酒主题不属于同一个连接组件子图的一部分。在将国会图书馆的主题头RDF读入GraphX图形并在skos:相关连接,以下是我在输出开始时发现的一些分组:"藏身之地""保密""孤独""孤独""隐私"--------------------------"鸡尾酒""酒吧(酒馆)""鸡尾酒会""餐厅""快乐时光"--------------------------"空间站""太空殖民地""大型空间结构(航天)""外星基地"--------------------------"伊娜娜(苏美尔神)""伊什塔(亚述巴比伦神)""阿斯塔特(腓尼基神)"--------------------------"跨文化导向""文化能力""多语言交流""跨文化交际""技术援助——人类学方面"--------------------------(您可以在这里找到完整的输出,一个565K文件)使用基于RDF的应用程序的人已经知道这种数据可以帮助增强搜索。例如,搜索有关"空间站"的媒体的人可能也会对"空间殖民地"和"外星基地"下的媒体感兴趣。这些数据还可以帮助其他应用程序,现在,它可以帮助使用Spark的分布式应用程序。在GraphX数据结构中存储RDF首先,正如我在前面的博客中提到的,GraphX开发目前意味着使用Scala编程语言进行编码,所以我一直在学习Scala。我在XML时代的老朋友Tony Coates为RDF处理编写了一个scalaapi,它比我以前更好地利用了本机Scala数据结构,banana RDF Scala库看起来也很有趣,但尽管我使用Scala,我的主要兴趣是将RDF存储在Spark GraphX数据结构中,而不是Scala中。Spark的基本数据结构是弹性分布式数据集(RDD)。GraphX使用的graph数据结构是顶点RDD和边RDD的组合。这些RDD中的每一个都可以有额外的信息;Spark网站的示例属性图包括(名称、角色)对及其顶点和描述性属性字符串及其边缘。显然,在GraphX图中存储RDF的第一步是在edges RDD中存储谓词,在vertices RDD中存储subjects和resource对象,在这些RDD中存储文本属性作为额外信息,比如Spark网站示例属性图中的(name,role)对和边缘描述字符串。但我也会问这些问题边的性质呢?例如,如果我想说xp:advisorproperty是rdfs:都柏林核心地产公司:贡献者?将诸如名称"rxin"和角色"student"之类的属性分配给3L这样的节点是很好的,但是如果我没有一个一致的属性集来分配给每个节点,例如,如果我聚合了来自两个不同源的人员数据,而这些数据源没有使用所有相同的属性来描述这些人,会怎么样?示例属性图可以将这些(名称、角色)对与顶点一起存储,因为RDD被声明为RDD[(VertexId,(String,String))]。每个顶点都将存储两个字符串;不多不少。这是一种数据结构,但是你也可以把它看作是一种禁止使用的模式,上面的第二个要点是如何绕过它。我通过将数据存储在三种数据结构(上面描述的两种RDD和另一种)中解决了这两个问题:对于vertex RDD,除了必须存储为每个顶点的标识符所需的长整数外,我只存储了一段额外的信息:与该RDF资源相关联的URI。我这样做是为了主题,谓词(可能不是单词的GraphX意义上的"顶点",但该死的,它们是资源,可以是三元组的主语或宾语,如果我想的话),以及相关的对象。在读了三重唱之后{ }从国会图书馆的数据,程序将在这个RDD中创建三个顶点,它们的节点标识符可能是1L、2L和3L,三元组的每个uri都存储在这些RDD顶点中。对于edge RDD,除了需要的两个长整数来标识边的起点和终点的顶点外,我的每条边还存储了相关谓词的URI作为边的"描述"。以上三倍的边缘是(1L,3L,\related).为了扩充从上面两个RDD创建的图形数据结构,我创建了第三个RDD来存储文本属性值。每个条目存储表示具有该属性的资源的顶点的长整数、表示该属性的长整数(在顶点RDD中分配给该属性的整数)和表示属性值的字符串。对于三重{ "Happy hours"}它可能存储(3L,4L,"Happy hours"),假设4L被存储为预标签属性。为了运行Connected Components算法,然后输出每个子图中每个成员的首选标签,我不需要这个RDD,但是它确实为您在Spark GraphX程序中使用RDF提供了许多可能性。创建关于国会图书馆主题标题连接组件的报告在加载这些数据结构(加上另一个允许快速查找首选标签的结构)之后,我下面的程序将GraphX连接组件算法应用于使用skos:相关属性连接顶点,如"鸡尾酒会"和"快乐时光"。迭代结果,它使用它们来加载一个哈希映射,其中包含连接组件的每个子图的列表。然后,它遍历每个列表,打印与每个子图的每个成员相关联的标签和一个连字符字符串,以显示每个列表的结束位置,如您在上面的摘录中所见。我不会更详细地讨论我的程序中的内容,因为我对它的评论相当多。(我确实要感谢我的朋友Tony,上面提到的,他帮助我度过了一个我在Scala范围问题上陷入困境的问题。而且,正如我之前警告过的,我的编码风格可能会让经验丰富的Scala程序员们窒息而死。我很乐意听到改进建议。)在用一小部分数据使程序正常运行后,我在从国会图书馆下载的1GB subjects-skos-2014-0306.nt文件上运行它,该文件包含7705147个三元组。Spark允许应用程序通过提供一个基础结构来扩展,以在多台机器上分布程序执行,但是我的单台机器上的8GB容量不足以运行这个程序,所以我使用了两个grep命令来创建一个只有skos:相关和预标签三倍。在这一点上,我一共有439430个三胞胎。因为我的代码没有考虑空白节点,所以我删除了使用它们的385个三元组,剩下439045个在一个60MB的文件中使用。运行成功,您可以按照前面显示的链接查看完整的输出。在RDF数据上运行的其他GraphX算法除了连接组件之外,其他GraphX算法还包括页面排名和三角形计数。图论是一个有趣的世界,到目前为止我最喜欢的短语是"绞死图"。RDF和链接数据技术最伟大的一点是,越来越多的有趣的数据被公开使用,随着新工具(如这些算法)与这些数据工具一起工作,这些工具可以在价格低廉、可扩展的集群上运行,速度比典型的Hadoop MapReduce作业快,因此有很多巨大的可能性。//////////////////////////////////////////////////////////////////// readLoCSH.scala文件:阅读国会图书馆主题标题//Spark GraphX graph,并将connectedComponents算法应用到那些//由连接skos:相关道具