我还有一个关于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。
感谢您的回答,祝您愉快。
答案 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)
}
}
希望这会有所帮助!
谢谢