apache-spark - Spark中的XML处理

标签 apache-spark

场景:
我的输入将是多个小型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/

相关文章:

apache-spark - SparkSession : ActiveSession vs DefaultSession

apache-spark - 如何将Spark流数据存储到Hortonworks中的Hdfs?

java - 无法从 Spark 的 Java 数据集中的 AWS S3 读取数据

apache-spark - 如何修复 oozie spark yarn 提交中的 '' java.lang.NoSuchMethodError"?

scala - Spark - 使用不同的数据类型以编程方式创建模式

apache-spark - 如何在 databricks 中的字符串内使用 %run 运行代码

scala - 如何命名聚合列?

python - 只能使用分区数相同的 RDD 进行 zip 错误

azure - 与 Azure Java SDK 一起使用时,Jackson 在 Apache Spark 中发生冲突

scala - 通过 Scala Spark 并行读取单独的目录并创建单独的 RDD