繁体   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