2017-09-05 12 views
0

でXMLを解析している間、私は私が私が解析できることを知っているスパーク

<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> 

のようなXML構造を持っている情報を行にヘッダー情報を追加する方法booksのような:

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

しかし、私は希望のようなヘッダー情報を各行に追加すると便利です。

この「headerinfo」をファイルを2回ロードせずにsparkを持つすべての行に追加し、グローバルvars/valsに情報を格納する方法はありますか?

ありがとうございます!

答えて

1

あなたは "ルート" タグから始まるすべてのXMLを読んで、その後、必要なタグを爆発することができます

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) 

出力:

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

病気、助けのおかげで答えを投票しました。 – kf2