Можем ли мы создать XML-файл с определенным узлом с помощью Spark Scala?

У меня есть еще один вопрос о Spark и Scala. Я хочу использовать эту технологию для получения данных и создания xml. Поэтому я хочу знать, можно ли создать узел самостоятельно (не автоматически) и какую библиотеку мы можем использовать? Я искал, но не нашел ничего интересного (как будто я новичок в этой технологии, я не знаю многих ключевых слов). Я хочу знать, есть ли в Spark что-то вроде этого кода (я пишу это в scala. Он работает локально, но я не могу использовать new 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)

Я хочу знать, возможно ли это сделать с искрой.

Спасибо за ваш ответ и хорошего дня.


person THIBAULT Nicolas    schedule 16.01.2019    source источник
comment
Я думаю, что искра не лучший инструмент для вас, чтобы сделать это. Я бы посоветовал вам использовать для этого Akka Framework.   -  person Thiago Baldim    schedule 17.01.2019


Ответы (1)


Не совсем так, но вы можете сделать что-то подобное, используя 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 с помощью XStream API. Если у вас уже есть данные в 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)
  }
}

Надеюсь это поможет !!

Спасибо

person Kumar    schedule 17.01.2019
comment
Здравствуйте, Навин, спасибо за ваш ответ. Считаете ли вы, что с этой технологией: x-stream.github.io/alias-tutorial. html , у меня может быть аналогичный результат? - person THIBAULT Nicolas; 17.01.2019
comment
Да, если ваш XML соответствует синтаксису и семантике XML. Помните, что Xstram API — это java/scala API, не созданный для Spark. Однако мы можем использовать его в spark для преобразования объекта в строку xml. - person Kumar; 17.01.2019
comment
Привет, для меня линия: val df = xmlString.toDF() - person THIBAULT Nicolas; 18.01.2019
comment
Извините, я нажимаю Enter, прежде чем закончить свой комментарий. - person THIBAULT Nicolas; 18.01.2019
comment
Опять таки. Как мы можем вернуться к строке, не оставив комментарий? линия val df = xmlString.toDF() не работала. У меня следующая ошибка: <console>:36: error: value toDF is not a member of String val df = xmlString.toDF(). Ты знаешь почему ? (Я не могу распечатать xmlString, но не могу конвертировать). Спасибо за вашу помощь. - person THIBAULT Nicolas; 18.01.2019
comment
Затем с помощью этой библиотеки в строку добавляются некоторые баллы, которые мне не нужны: <testAni> <cricri>Rugissement</cricri> <taille>150</taille> <_-outer> <_-outer> <_-iw reference="../.."/> <_-outer> <_-iw reference="../.."/> </_-outer> </_-outer> </_-outer> </testAni> Мне не нужны внешние и справочные. Только cricri и taille. (продолжаю искать на своей стороне). - person THIBAULT Nicolas; 18.01.2019
comment
Добавьте, пожалуйста, вашу полную новую программу по этому вопросу или по другому вопросу, я ее исправлю и перешлю вам. Я сделал это в своем проекте, и это работает хорошо !!! - person Kumar; 18.01.2019
comment
Нет, я прошу stackOverflow: D. У меня все еще есть две проблемы, о которых я говорил раньше. - person THIBAULT Nicolas; 18.01.2019
comment
В stackoverlow отступ работает только для вопросов и ответов, но не для комментариев. Я обновил свой ответ, добавив дополнительную информацию и пример. - person Kumar; 18.01.2019
comment
Удалось ли вам продвинуться в решении? - person Kumar; 21.01.2019