簡體   English   中英

如何在具有此文件路徑的rdd中打開文件?

[英]How to open a file in the rdd having path to this file?

我正在使用Scala處理關於Apache Spark的哨兵圖像數據。 在某些步驟中,我過濾了包含特定位置的元數據,對於那些數據,我想打開位於子文件夾中的新文件。

篩選器rdd包含key作為具有globalmetadata的文件的路徑,而value作為我要打開的文件的路徑。

var global_and_cloud=global_filter.map{case(name, positions_list, granule)=>
(name, (name.substring(0, name.length-14)+granule.substring(13,56)+"QI_DATA/MSK_CLOUDS_B00.gml"))}

我能做的最好的就是

var global_and_cloud2=global_and_cloud.map{case(name, cloud_path)=>
(sc.wholeTextFiles(cloud_path).first._1, sc.wholeTextFiles(cloud_path).first._2)}

但是當我要對其采取行動時,它拋出了異常java.lang.NullPointerException,

當我做的時候

sc.wholeTextFiles(global_and_cloud.first._2).first._2

我得到文件的內容,所以它存在

有什么辦法可以讀取rdd中的文件?

您不能在用於操作RDD數據的任何函數(即傳遞給RDD.mapRDD.filter等的函數)中使用Spark的驅動程序側抽象( SparkSessionRDDDataFrame等)。此處: 由org.apache.spark.sql.Dataset處的java.lang.NullPointerException引起

您必須collect() global_and_cloud RDD,這將創建一個文件名的本地數組(在驅動程序應用程序的內存中),然后您可以將其映射到一個文件名數組和包含該文件數據的RDD中,例如:

val files: Array[(String, String)] = global_and_cloud.collect()

// since "files" is a "local" array and not an RDD - we can use 
// "sc" when mapping its values:
val rdds: Array[(String, RDD[String])] = files.map {
  case(name, cloud_path) => (name, sc.textFile(cloud_path))
}

注意,如果global_and_cloud太大而無法收集到本地內存中,則可能會導致運行緩慢或OutOfMemoryError 但這意味着您試圖“打開”數百萬個文件,但無論如何都會失敗(將需要太多的驅動程序內存來​​容納那么多的RDD)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM