[英]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.map
, RDD.filter
等的函數)中使用Spark的驅動程序側抽象( SparkSession
, RDD
, DataFrame
等)。此處: 由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.