场景:
我的输入将是多个小型XML,并且应该将这些XML读取为RDD。执行与另一个数据集的连接并形成一个RDD,并将输出作为XML发送。
是否可以使用spark读取XML,将数据作为RDD加载?如果可能的话,如何读取XML。
样本XML:
<root>
<users>
<user>
<account>1234<\account>
<name>name_1<\name>
<number>34233<\number>
<\user>
<user>
<account>58789<\account>
<name>name_2<\name>
<number>54697<\number>
<\user>
<\users>
<\root>
如何将其加载到RDD中?
最佳答案
是的,这是可能的,但是细节会因您采用的方法而异。
如前所述,如果文件很小,则最简单的解决方案是使用SparkContext.wholeTextFiles
加载数据。它将数据加载为RDD[(String, String)]
,其中第一个元素是路径,第二个文件内容。然后,您像在本地模式下一样分别解析每个文件。
对于较大的文件,可以使用Hadoop input formats。
如果结构简单,则可以使用textinputformat.record.delimiter
拆分记录。您可以找到一个简单的示例here。输入不是XML,但您应该给您输入信息并知道如何继续
否则Mahout提供XmlInputFormat
最后,可以使用SparkContext.textFile
读取文件,并稍后进行调整以适应分区之间的记录。从概念上讲,这意味着与创建滑动窗口或partitioning records into groups of fixed size类似:
使用mapPartitionsWithIndex
分区来识别分区之间损坏的记录,收集损坏的记录
使用第二个mapPartitionsWithIndex
修复损坏的记录
编辑:
还有一个相对较新的spark-xml
包,它允许您通过标记提取特定记录:
val df = sqlContext.read
.format("com.databricks.spark.xml")
.option("rowTag", "foo")
.load("bar.xml")
关于apache-spark - Spark中的XML处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33078221/