2017-09-22 44 views
-1

我的火花流傳輸作業將壓縮的XML文件解壓縮並將其作爲字符串附加到parquet文件。 我的批處理作業讀取實木複合地板文件。該文件僅包含一列解壓縮的xml字符串。如何從實木複合地板柱中提取XML字符串

平面文件架構:

DF.printSchema() 


| - 解壓縮:字符串(可爲空=真)在拼花文件

樣本記錄

DF.show(1,False) 

|decompress               
------------------------------------------------+ 
|<Sale><ItemID >10</ItemID>......</Sale> 

是有什麼辦法可以應用數據磚XML包上提取XML元素。除了編寫UDF之外,我還有其他選擇嗎?我將UDF作爲第二選項,考慮UDF需要更多時間來處理。

回答

1

您只能在文件(不在RDD/DF上)上應用數據文件包spark-xml。這裏唯一的選擇是使用DF.write.text()作爲文本文件將DF保存在某個臨時路徑下並讀取新保存的文件。

但是,這裏出現了一個問題 - 爲什麼要將XML作爲一列式實木複合拼接文件保存在火花流工作中?爲什麼不計劃文本文件,可讀spark-xml包?

+0

謝謝你,馬呂斯。爲了實時報告目的,我的流式作業必須從壓縮XML中提取特定列。我的批處理作業必須爲下游系統準備數據。我的批處理作業每天運行一次。在流式作業中,我嘗試解壓縮XML文件,提取報告所需的列,爲批處理準備數據(批處理作業需要完整的XML內容)。對於批處理過程,我不想擁有數千個非常小的文件,爲此我試圖追加到文件中,而不是將每個流都放在單獨的文件中。 –

+0

AFAIK,即使您追加到parquet數據集(在流式作業中),也會在目錄中創建小文件。在火花中,你不能輕易地追加到鑲木地板文件,請參見[SPARK-18199](https://issues.apache.org/jira/browse/SPARK-18199)。如果您將編寫方法更改爲原始文本文件,它將允許您在批處理作業中直接讀取它們。 – Mariusz

相關問題