繁体   English   中英

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

[英]Can we create a xml file with specific node with Spark Scala?

我还有一个关于 Spark 和 Scala 的问题。 我想使用该技术来获取数据并生成一个 xml。 因此,我想知道是否可以自己创建节点(不是自动创建)以及我们可以使用什么库? 我进行了搜索,但没有发现任何有趣的东西(就像我是这项技术的新手一样,我不知道很多关键字)。 我想知道 Spark 中是否有这样的代码(我用 Scala 编写。它在本地工作,但我不能在 Spark 中使用 new 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 上使用 Spark XML API pr 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)
  }
}

希望这可以帮助 !!

谢谢

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM