2017-09-05 1 views
0

J'ai une structure xml commeComment ajouter des informations en-tête à la ligne d'information lors de l'analyse d'un xml avec étincelle

<root> 
    <bookinfo> 
    <time>1232314973</time> 
    <requestID>233</requestID> 
    <supplier>asd123</supplier> 
    </bookinfo> 

<books> 
    <book> 
     <name>book1</name> 
      <pages>124</pages> 
    </book> 
    <book> 
     <name>book2</name> 
      <pages>456</pages> 
    </book> 
    <book> 
     <name>book4</name> 
      <pages>789</pages> 
    </book> 
</books> 
</root> 

Je sais que je peux analyser le books comme:

val xml = sqlContext.read.format("com.databricks.spark.xml") 
        .option("rowTag", "book").load("FILENAME") 

Mais je tiens à ajouter les informations d'en-tête comme supplier à chacune des lignes.

Y at-il un moyen d'ajouter ce "headerinfo" à toutes les lignes avec étincelle sans charger le fichier deux fois et stocker l'information dans vars/vals globaux?

Merci d'avance!

Répondre

1

Vous pouvez lire tout xml à partir de la balise "racine", puis exploser les balises nécessaires:

val df = hiveContext.read.format("xml").option("rowTag", "root").load("books.xml") 
df.printSchema() 
df.show(false) 

println("-- supplier --") 
val supplierDF = df.select(col("bookinfo.supplier")) 
supplierDF.printSchema() 
supplierDF.show(false) 

println("-- books --") 
val booksDF = df.select(explode(col("books.book")).alias("bookDetails")) 
booksDF.printSchema() 
booksDF.show(false) 

println("-- bookDetails --") 
val booksDetailsDF = booksDF.select(col("bookDetails.name"), col("bookDetails.pages")) 
booksDetailsDF.printSchema() 
booksDetailsDF.show(false) 

Sortie:

root 
|-- bookinfo: struct (nullable = true) 
| |-- requestID: long (nullable = true) 
| |-- supplier: string (nullable = true) 
| |-- time: long (nullable = true) 
|-- books: struct (nullable = true) 
| |-- book: array (nullable = true) 
| | |-- element: struct (containsNull = true) 
| | | |-- name: string (nullable = true) 
| | | |-- pages: long (nullable = true) 

+-----------------------+-----------------------------------------------------+ 
|bookinfo    |books            | 
+-----------------------+-----------------------------------------------------+ 
|[233,asd123,1232314973]|[WrappedArray([book1,124], [book2,456], [book4,789])]| 
+-----------------------+-----------------------------------------------------+ 

-- supplier -- 
root 
|-- supplier: string (nullable = true) 

+--------+ 
|supplier| 
+--------+ 
|asd123 | 
+--------+ 

-- books -- 
root 
|-- bookDetails: struct (nullable = true) 
| |-- name: string (nullable = true) 
| |-- pages: long (nullable = true) 

+-----------+ 
|bookDetails| 
+-----------+ 
|[book1,124]| 
|[book2,456]| 
|[book4,789]| 
+-----------+ 

-- bookDetails -- 
root 
|-- name: string (nullable = true) 
|-- pages: long (nullable = true) 

+-----+-----+ 
|name |pages| 
+-----+-----+ 
|book1|124 | 
|book2|456 | 
|book4|789 | 
+-----+-----+ 
+0

grâce qui ont aidé, mal voté la réponse. – kf2