2017-08-18 90 views
-1

我想將帶有3個不同RowTags的巨大XML文件讀取到Apache Spark Dataframes中。使用多個行標記在Spark中讀取XML文件

RowTag = XML元素,您將其解釋爲Spark中的一行。

的標籤

  • 包含不同的數據結構
  • 不重疊

XML的火花(https://github.com/databricks/spark-xml)只提供閱讀一個RowTag一段時間,所以我需要閱讀相同的文件3次(不高效)。

有沒有什麼方法可以在一次讀取中讀取文件?

詳情:

我有包含3列出了一個巨大的XML文件(24 GB):

<myFile> 
    <ContainedResourceList> 
     <SoundRecording><Title>A</Title></SoundRecording> 
     ... several million records ... 
     <SoundRecording><Title>Z</Title></SoundRecording> 
    </ContainedResourceList> 

    <ContainedReleaseList> 
     <Release><ReleaseType>Single</ReleaseType></Release> 
     ... several million records ... 
     <Release><ReleaseType>LP</ReleaseType></Release> 
    </ContainedReleaseList> 

    <ContainedTransactionList> 
     <Transaction><Sales>1</Sales></Transaction> 
     ... several million records ... 
     <Transaction><Sales>999</Sales></Transaction> 
    </ContainedTransactionList> 
</myFile> 

XML文件是有效的。 我想閱讀RowTags SoundRecording,發佈&事務。

我寧願Scala libs,但我會很高興任何使能閱讀的庫。

PS: 他的模式輸出&怎麼可能看起來像?

  • 最佳選擇:對於每個RowTag
  • 醜陋期權3個DataFrames的數組,一個:一個包含所有3個數據結構的可能要素數據幀

回答

0

一種簡單的方法是使用爆炸功能。你可以用rowTag設置爲ContainedResourceList閱讀完整的XML,然後用得到的數據框爆炸數據框用新列

df.withColumn("soundRec", explode($"SoundRecording")) 

你可以爲你想爆炸

+0

我感謝你們每個標籤添加多個列爲建議的解決方案。建議的「爆炸」解決方案適用於小文件。但它在一個巨大的文件(24 GB)上失敗:'java.lang.OutOfMemoryError:請求的數組大小超過VM限制' 在此解決方案中,整個ContainedResourceList被讀入一條記錄。 ContainedResourceList包含ca. 1000萬SoundRecordings。 ContainedResourceList大小爲ca.輸入文件的1/3。 我在3個主機羣集上測試每個8GB RAM。我可以使用更多的RAM,但是爲了在一臺主機上讀取整個文件而使用大量RAM並不是使用Spark的理念。 – JanDE