簡體   English   中英

循環遍歷 RDD 元素,讀取其內容以進行進一步處理

[英]Loop through RDD elements, read its content for further processing

我有一個包含n個文件的文件夾。

我正在創建一個 RDD,其中包含上述文件夾的所有文件名,代碼如下:

fnameRDD = spark.read.text(filepath).select(input_file_name()).distinct().rdd)

我想遍歷這些RDD元素並處理以下步驟:

  1. 讀取每個元素的內容(每個元素都是一個文件路徑,所以需要通過SparkContext讀取內容)
  2. 以上內容應該是另一個 RDD,我想將其作為參數傳遞給 Function
  3. 對作為內部參數傳遞的名為 function 的 RDD 執行某些步驟

我已經寫了一個 Function,其中包含我已經針對單個文件測試過的步驟並且它工作正常但是我在語法上嘗試了各種方法來完成前 2 個步驟,但我每次都得到無效的語法。

我知道我不應該使用map()因為我想在每次迭代中讀取一個需要sc的文件,但是map將在無法引用sc的工作節點內執行。

另外,我知道我可以使用wholeTextFiles()作為替代方法,但這意味着我將在整個過程中擁有 memory 中所有文件的文本,這對我來說似乎效率不高。

我也願意接受有關不同方法的建議。

我相信您正在尋找遞歸文件查找,

spark.read.option("recursiveFileLookup", "true").text(filepathroot)

如果將其指向文件的根目錄,spark 將遍歷該目錄並選取位於根文件夾和子文件夾下的所有文件,這會將文件讀入單個 dataframe

可能還有其他更有效的方法,但假設您已經有一個 function SomeFunction(df: DataFrame[value: string]) ,最簡單的方法是在fnameRDD上使用toLocalIterator()一次處理一個文件。 例如:

for x in fnameRDD.toLocalIterator():
  fileContent = spark.read.text(x[0])
# fileContent.show(truncate=False)
  SomeFunction(fileContent)

暫無
暫無

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

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