我有以下問題:假設我有一個包含壓縮目錄的目錄,該壓縮目錄包含多個文件,存儲在HDFS上。我想創建一個包含一些T類型對象的RDD,即:context = new JavaSparkContext(conf);JavaPairRDD<String, String> filesRDD = context.wholeTextFiles(inputDataPath);JavaPairRDD<String, String> filesRDD = context.wholeTextFiles(inputDataPath);JavaRDD<T> processingFiles = filesRDD.map(fileNameContent -> { // The name of the file String fileName = fileNameContent._1(); // The content of the file String content = fileNameContent._2(); // Class T has a constructor of taking the filename and the content of each // processed file (as two strings) T t = new T(content, fileName); return t;});現在,當inputDataPath目錄包含文件時,可以很好地工作,例如,當它類似于:String inputDataPath = "hdfs://some_path/*/*/"; // because it contains subfolders但是,當一個tgz包含多個文件時,文件內容(fileNameContent._2())為我提供了一些無用的二進制字符串(相當不錯)。我在SO上發現了類似的問題,但是情況不一樣,因為解決方案是每次壓縮僅包含一個文件,而在我的情況下,還有許多其他文件需要單獨讀取為整個文件。我還發現了有關的問題wholeTextFiles,但這在我的情況下不起作用。任何想法如何做到這一點?編輯:我試圖從讀者在這里(試圖從測試的讀者在這里,就像在功能testTarballWithFolders()),但每當我打電話TarballReader tarballReader = new TarballReader(fileName);我得到NullPointerException:java.lang.NullPointerException at java.util.zip.InflaterInputStream.<init>(InflaterInputStream.java:83) at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:77) at java.util.zip.GZIPInputStream.<init>(GZIPInputStream.java:91) at utils.TarballReader.<init>(TarballReader.java:61) at main.SparkMain.lambda$0(SparkMain.java:105) at main.SparkMain$$Lambda$18/1667100242.call(Unknown Source) at org.apache.spark.api.java.JavaPairRDD$$anonfun$toScalaFunction$1.apply(JavaPairRDD.scala:1015) at scala.collection.Iterator$$anon$11.next(Iterator.scala:328) at scala.collection.Iterator$class.foreach(Iterator.scala:727)第105行MainSpark是我在帖子編輯中顯示的上方的行,而第61行TarballReader是GZIPInputStream gzip = new GZIPInputStream(in);in上面一行輸入流的值為空:InputStream in = this.getClass().getResourceAsStream(tarball);我在正確的道路上嗎?如果是這樣,我如何繼續?為什么我得到這個空值,我該如何解決?
2 回答

守著一只汪
TA貢獻1872條經驗 獲得超4個贊
可接受答案的一個小改進是更改
Option(tar.getNextTarEntry)
至
Try(tar.getNextTarEntry).toOption.filter( _ != null)
以.tar.gz健壯的方式應對格式錯誤/截斷的。
順便說一句,緩沖區數組的大小有什么特別之處嗎?如果接近平均文件大?。ㄔ谖业那闆r下可能是500k),平均速度會更快嗎?我猜是Stream相對于whileJava式的循環而言,我看到的是速度下降還是更可能是相對而言的開銷。
添加回答
舉報
0/150
提交
取消