我们可以使用 Spark Scala 创建具有特定节点的 xml 文件吗?
Posted
技术标签:
【中文标题】我们可以使用 Spark Scala 创建具有特定节点的 xml 文件吗?【英文标题】:Can we create a xml file with specific node with Spark Scala? 【发布时间】:2019-01-16 18:17:15 【问题描述】:我还有一个关于 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 不是您执行此操作的最佳工具。我建议你使用 Akka 框架。 【参考方案1】:不完全是,但您可以通过在 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)
希望这会有所帮助!!
谢谢
【讨论】:
您好 Naveen,感谢您的回答。你认为使用这种技术:x-stream.github.io/alias-tutorial.html,我可以得到类似的结果吗? 可以,只要您的 XML 遵循 XML 语法和语义。记住 Xstram API 不是为 Spark 创建的 java/scala api。但是,我们可以在 spark 中使用它来将对象转换为 xml 字符串。 你好,对我来说是 ligne:val df = xmlString.toDF() 对不起,我在完成评论之前按 Enter 键。 再次。我们如何在不发表评论的情况下返回该行?木质val df = xmlString.toDF()
不起作用。我有以下错误:<console>:36: error: value toDF is not a member of String val df = xmlString.toDF()
。你知道为什么吗 ? (我不能打印 xmlString 但不能转换)。感谢您的帮助。以上是关于我们可以使用 Spark Scala 创建具有特定节点的 xml 文件吗?的主要内容,如果未能解决你的问题,请参考以下文章
使用来自另一个 DF (Scala Spark) 的模式创建一个空 DF
通过读取具有不同数据类型的 Scala 序列来创建 Spark 数据帧
使用 databricks 在 Spark(scala) 中生成具有属性和值的 XML
如何在 Scala Spark 中使用具有许多条件的“.withColumn”为数据集创建新列