Можем ли мы создать XML-файл с конкретным узлом с помощью Spark Scala?
У меня есть еще один вопрос о Спарк и Скала. Я хочу использовать эту технологию для получения данных и создания XML. Поэтому я хочу знать, возможно ли создание узла самостоятельно (не автоматическое создание) и какую библиотеку мы можем использовать? Я ищу, но не нашел ничего очень интересного (как будто я новичок в этой технологии, я не знаю много ключевых слов). Я хочу знать, есть ли в Spark что-то вроде этого кода (я пишу это в Scala. Он работает локально, но я не могу использовать новый File() в Spark).
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)
Я хочу знать, возможно ли это сделать с помощью искры.
Спасибо за ваш ответ и хорошего дня.
1 ответ
Не совсем, но вы можете сделать нечто подобное, используя Spark XML API pr XStream API на Spark.
Сначала попробуйте использовать Spark XML API, который наиболее полезен при чтении и записи файлов XML с использованием Spark. Однако на момент написания этой статьи 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.
В качестве альтернативы вы можете посмотреть на API XStream. Ниже приведены инструкции по его использованию для создания пользовательских структур XML.
1) Сначала создайте класс Scala, подобный структуре, которую вы хотели в XML.
case class XMLData(name:String, value:String, attr:String)
2) Создать экземпляр этого класса
val data = XMLData("bookName","AnyValue", "AttributeValue")
3) Преобразование объекта данных в XML с использованием API XStream. Если у вас уже есть данные в 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")
Вот полный пример с API-интерфейсом XStream
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)
}
}
Надеюсь это поможет!!
Спасибо