2016-07-28 104 views
4

我試圖從幾個json文件壓縮成一個tar來創建一個Spark RDD。 例如,我有3個文件將tar.gz壓縮成多個文件壓入Spark

file1.json 
file2.json 
file3.json 

而這些都包含在archive.tar.gz

我想從json文件創建一個數據幀。問題是Spark沒有正確讀取json文件。使用sqlContext.read.json("archive.tar.gz")sc.textFile("archive.tar.gz")創建RDD會導致亂碼/額外輸出。

是否有某種方法可以處理包含Spark中多個文件的gzip壓縮文件?

UPDATE

使用的答案給Read whole text files from a compression in Spark的方法我能得到的東西運行,但這種方法似乎並不適用於大型的tar.gz檔案(> 200 MB壓縮)作爲該應用程序在大檔案大小上窒息。由於我正在處理的一些壓縮文件的壓縮率高達2 GB我想知道是否有一些有效的方法來處理這個問題。

我試圖避免提取檔案,然後合併文件在一起,因爲這將是耗時的。

+0

我面對大文件的同樣的問題,你找到一個解決方案(除了手動解壓縮,然後加載到火花)? :) – ixaxaar

+0

@ixaxaar,我最終將所有的tar檔案轉換爲Spark很好地工作的hadoop序列文件。 https://stuartsierra.com/2008/04/24/a-million-little-files – septra

+0

非常感謝罐子!我實際上有50個tar文件,每個文件有一百萬個小(json)文件:D – ixaxaar

回答

6

解決方案在Read whole text files from a compression in Spark中給出。 使用提供的代碼示例,我能夠從壓縮歸檔創建一個數據幀像這樣:

這種方法工作正常尺寸相對較小的tar歸檔,但不適合大型檔案大小。

一個更好的解決問題的辦法似乎是轉換的tar歸檔到HADOOP SequenceFiles,其是可分離的,並因此可以讀取和在火花並行處理

見(相對於tar歸檔。): stuartsierra.com/2008/04/24/a-million-little-files

-1

* * .tar.gz文件中的文件,正如您已經提到的那樣是壓縮的。您不能將3個文件放到一個壓縮的tar文件中,並期望導入功能(只查找文本)知道如何處理文件解壓縮,從tar歸檔文件解壓縮文件,然後單獨導入每個文件。

我建議你花時間手動上傳每個單獨的json文件,因爲sc.textfile和sqlcontext.read.json函數都無法處理壓縮數據。