Не совсем, но вы можете сделать нечто подобное, используя Spark XML API или 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.
В качестве альтернативы вы можете посмотреть XStream API . Ниже приведены инструкции по его использованию для создания пользовательских структур 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")
Вот полный пример с 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)
}
}
Надеюсь, это поможет !!
Спасибо