我们可以使用Spark Scala创建具有特定节点的xml文件吗?

时间:2019-01-16 18:17:16

标签: scala apache-spark apache-spark-xml

我还有一个关于Spark和Scala的问题。我想使用该技术来获取数据并生成xml。 因此,我想知道是否可以自己创建节点(而不是自动创建),以及我们可以使用哪个库?我搜寻了一下,但没有发现任何有趣的东西(就像我是这项技术的新手一样,我并不认识很多关键字)。   我想知道Spark中是否有类似以下代码的代码(我在scala中编写了代码。它在本地运行,但是我不能在Spark中使用新的File()。)

val docBuilder: DocumentBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder()
  val document = docBuilder.newDocument()

ar root:Element = document.createElement("<name Balise>")
    attr = document.createAttribute("<attr1>")
    attr.setValue("<value attr1>")
    root.setAttributeNode(<attr>)
    attr = document.createAttribute("<attr2>")
    attr.setValue("<value attr2>")
    root.setAttributeNode(attr)
    document.appendChild(root)
    document.setXmlStandalone(true)

var transformerFactory:TransformerFactory = TransformerFactory.newInstance()
    var transformer:Transformer = transformerFactory.newTransformer()
    var domSource:DOMSource = new DOMSource(document)
    var streamResult:StreamResult = new StreamResult(new File(destination))
    transformer.transform(domSource,streamResult)

我想知道是否有可能用spark。

感谢您的回答,祝您愉快。

1 个答案:

答案 0 :(得分:1)

不完全是,但是您可以通过在Spark上使用Spark XML API或XStream API来执行类似的操作。

首先尝试使用Spark XML API,这在使用Spark读写XML文件时最有用。但是,在撰写本文时,Spark XML具有以下限制。

 1) Adding attribute to root element has not supported.
 2) Does not support following structure where you have header and footer elements. 

  <parent>
       <header></header>
       <dataset> 
          <data attr="1"> suports xml tags and data here</data>
          <data attr="2">value2</data>  
      </dataset>
      <footer></footer>
  </parent>  

如果您具有一个根元素并跟踪数据,则Spark XML将转到api。

或者,您可以查看 XStream API 。以下是如何使用它创建自定义XML结构的步骤。

1)首先,创建一个与XML中所需结构相似的Scala类。

case class XMLData(name:String, value:String, attr:String) 

2)创建此类的实例

val data = XMLData("bookName","AnyValue", "AttributeValue")

3)使用XStream API将数据对象转换为XML。如果您已经在DataFrame中包含数据,请执行映射转换以将数据转换为XML字符串并将其存储回DataFrame中。如果这样做,则可以跳过第4步

val xstream = new XStream(new DomDriver)
val xmlString = xstream.toXML(data)

4)现在将xmlString转换为DataFrame

val df = xmlString.toDF()

5)最后,写入文件

df.write.text("file://filename")

这是XStream API的完整示例示例

import com.thoughtworks.xstream.XStream
import com.thoughtworks.xstream.io.xml.DomDriver
import org.apache.spark.sql.SparkSession

case class Animal(cri:String,taille:Int)

object SparkXMLUsingXStream{
  def main(args: Array[String]): Unit = {
    val spark = SparkSession.
    builder.master ("local[*]")
    .appName ("sparkbyexamples.com")
    .getOrCreate ()

    var animal:Animal = Animal("Rugissement",150)
    val xstream1 = new XStream(new DomDriver())
    xstream1.alias("testAni",classOf[Animal])
    xstream1.aliasField("cricri",classOf[Animal],"cri")
    val xmlString = Seq(xstream1.toXML(animal))

    import spark.implicits._
    val newDf = xmlString.toDF()
    newDf.show(false)
  }
}

希望这会有所帮助!

谢谢