Можем ли мы создать XML-файл с конкретным узлом с помощью Spark Scala? - PullRequest
0 голосов
/ 16 января 2019

У меня есть еще один вопрос о 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 Ответ

0 голосов
/ 17 января 2019

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

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

Спасибо

...