分享

Spark 高级分析:第七章第2,3节 获取数据并解析

feilong 2018-7-20 10:15:43 发表于 连载型 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 3 5615
本帖最后由 feilong 于 2018-7-27 09:47 编辑

问题导读

1.如何获取样本数据?
2.如何使用Scala解析XML文件?
3.
Scala解析XML文件需要导入依赖吗






上一篇:Spark 高级分析:第七章第1节 MEDLINE引文索引:网络分析
http://www.aboutyun.com/forum.php?mod=viewthread&tid=24834



第2节 获取数据我们可以从NIH的FTP服务器检索引文索引数据的样本:
[mw_shl_code=bash,true]$ mkdir medline_data
$ cd medline_data
$ wget ftp://ftp.nlm.nih.gov/nlmdata/sample/medline/*.gz[/mw_shl_code]
让我们解压缩引文数据并在加载到HDFS之前检查它:
[mw_shl_code=bash,true]$ gunzip *.gz
$ ls -ltr
...
total 843232
-rw-r--r-- 1 spark spark 162130087 Dec 17 2013 medsamp2014h.xml
-rw-r--r-- 1 spark spark 146357238 Dec 17 2013 medsamp2014g.xml
-rw-r--r-- 1 spark spark 132427298 Dec 17 2013 medsamp2014f.xml
-rw-r--r-- 1 spark spark 102401546 Dec 17 2013 medsamp2014e.xml
-rw-r--r-- 1 spark spark 102715615 Dec 17 2013 medsamp2014d.xml
-rw-r--r-- 1 spark spark 89355057 Dec 17 2013 medsamp2014c.xml
-rw-r--r-- 1 spark spark 69209079 Dec 17 2013 medsamp2014b.xml
-rw-r--r-- 1 spark spark 58856903 Dec 17 2013 medsamp2014a.xml[/mw_shl_code]
示例文件包含大约600 MB的XML格式数据,未压缩。样本文件中的每个条目都是一个MedlineCitation记录,其中包含有关生物医学期刊文章发布的信息,包括期刊名称、发布日期、作者姓名、摘要以及与关键词相关联的网格关键词集及文章。此外,每个网格关键字都有一个属性来指示关键字引用的概念是否是文章的主题。让我们来看看medsamp2014a.xml中的第一个引用记录:
[mw_shl_code=xml,true]<MedlineCitation Owner="PIP" Status="MEDLINE">
<PMID Version="1">12255379</PMID>
<DateCreated>
<Year>1980</Year>
<Month>01</Month>
<Day>03</Day>
</DateCreated>
...
<MeshHeadingList>
...
<MeshHeading>
<DescriptorName MajorTopicYN="N">Intelligence</DescriptorName>
</MeshHeading>
<MeshHeading>
<DescriptorName MajorTopicYN="Y">Maternal-Fetal Exchange</DescriptorName>
</MeshHeading>
...
</MeshHeadingList>
...
</MedlineCitation>[/mw_shl_code]
在我们对维基百科文章的潜在语义分析中,我们主要对包含在每个XML记录中的非结构化文章文本感兴趣。但是对于我们的同现分析,我们希望通过直接解析XML的结构来提取包含在描述符名称标签中的值。幸运的是,Scala有一个优秀的库Scala XML,用于直接解析和查询XML文档,可以用来帮助我们解析。
将引用数据导入HDFS:
[mw_shl_code=bash,true]$ hadoop fs -mkdir medline
$ hadoop fs -put *.xml medline[/mw_shl_code]
现在我们可以启动一个Spark Shell实例。本章依赖于潜在语义分析章节中描述的用于解析XML格式化数据的代码。要编译这个代码到一个jar,以便我们可以使用它,进入Git 库中的common/目录,并用Maven构建它。
[mw_shl_code=bash,true]$ cd common/
$ mvn package
$ spark-shell --jars target/common-1.0.0.jar[/mw_shl_code]
写一个将XML格式的MEDLINE书序读到shell的方法:
[mw_shl_code=scala,true]import com.cloudera.datascience.common.XmlInputFormat
import org.apache.spark.SparkContext
import org.apache.hadoop.io.{Text, LongWritable}
import org.apache.hadoop.conf.Configuration
def loadMedline(sc: SparkContext, path: String) = {
@transient val conf = new Configuration()
conf.set(XmlInputFormat.START_TAG_KEY, "<MedlineCitation ")
conf.set(XmlInputFormat.END_TAG_KEY, "</MedlineCitation>")
val in = sc.newAPIHadoopFile(path, classOf[XmlInputFormat],
classOf[LongWritable], classOf[Text], conf)
in.map(line => line._2.toString)
}
val medline_raw = loadMedline(sc, "medline")[/mw_shl_code]
我们将START_TAG_KEY配置参数的值设置为MedlineCitation标签的前缀,因为标签属性的值可能会从记录改变到记录。XmlInputFormat将包含返回的记录值中的这些不同属性。

第3节 用Scala XML库解析XML文件

Scala有一个有趣的XML历史。自版本1.2以来,Scala将XML视为一级数据类型。这意味着下面的代码在语法上是有效的:
[mw_shl_code=scala,true]import scala.xml._
val cit = <MedlineCitation>data</MedlineCitation>[/mw_shl_code]
XML文本的这种支持在一些主要的编程语言中一直是不寻常的,尤其是其他的串行化格式如JSON已经被广泛使用。2012,Martin Odersky通过邮件发布对Scala语言了做了以下批注:
[XML字面量]在当时看来是一个好主意,现在它像一个大拇指一样伸出。我相信通过新的字符串插值方案,我们将能够将所有XML处理放在库中,这将是一个巨大的胜利。
- Martin Odersky

至于Scala 2.11,ScalaXML包不再是核心Scala库的一部分。升级之后,需要显式地包含Scala XML依赖项,以便在项目中使用Scala XML库。
考虑到这一点,Scala对XML文档的解析和查询的支持非常出色,我们将利用它来帮助我们从MEDLINE引文中提取所需的信息。让我们先把未经分析的第一条引文记录放到我们的Spark Shell中:
[mw_shl_code=scala,true]def majorTopics(elem: Elem): Seq[String] = {
val dn = elem \\ "DescriptorName"
val mt = dn.filter(n => (n \ "@MajorTopicYN").text == "Y")
mt.map(n => n.text)
}
majorTopics(elem)[/mw_shl_code]
既然我们的XML解析代码在本地工作,让我们应用它来解析RDD中的每个引用记录的网格代码,并缓存结果:
[mw_shl_code=scala,true]val mxml: RDD[Elem] = medline_raw.map(XML.loadString)
val medline: RDD[Seq[String]] = mxml.map(majorTopics).cache()
medline.take(1)(0)[/mw_shl_code]



已有(3)人评论

跳转到指定楼层
天剑王侯 发表于 2018-7-23 12:02:12
你好,我下载这个数据一致报错提示Scheme missing.请问是无法下载吗
回复

使用道具 举报

feilong 发表于 2018-7-27 09:48:43
天剑王侯 发表于 2018-7-23 12:02
你好,我下载这个数据一致报错提示Scheme missing.请问是无法下载吗

wget ftp://ftp.nlm.nih.gov/nlmdata/sample/medline/*.gz
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条