亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從Spark壓縮中讀取整個文本文件

從Spark壓縮中讀取整個文本文件

冉冉說 2019-11-19 14:51:48
我有以下問題:假設我有一個包含壓縮目錄的目錄,該壓縮目錄包含多個文件,存儲在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式的循環而言,我看到的是速度下降還是更可能是相對而言的開銷。


查看完整回答
反對 回復 2019-11-19
  • 2 回答
  • 0 關注
  • 708 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號