假设我读了整个文件:
JavaPairRDD<String, String> filesRDD = sc.wholeTextFiles(inputDataPath);
然后,我有以下映射器,其中s:
JavaRDD<List<String>> processingFiles = filesRDD.map(fileNameContent -> {
List<String> results = new ArrayList<String>();
for ( some loop ) {
if (condition) {
results.add(someString);
}
}
. . .
return results;
});
为了论证,假设在mapper中我需要创建一个字符串列表,我从每个文件返回。现在,每个列表中的每个字符串都可以独立查看,以后需要单独处理。我不希望Spark一次处理每个列表,但每个列表的每个字符串一次处理。后来当我使用collect()
时,我得到了一个列表列表。
这样做的一种方法是:如何单独为每个字符串并行化这个列表列表,而不是单独为每个列表并行化?
答案 0 :(得分:1)
不是映射文件RDD以获取列表列表,而是平面映射它,您可以获得字符串的RDD。
编辑:根据请求添加评论
Map是1:1函数,其中1个输入行 - &gt; 1输出行。 Flatmap是1:N函数,其中1个输入行 - &gt;许多(或0)输出行。如果使用flatMap,则可以将其设计为输出RDD和字符串的RDD,而当前输出RDD是字符串列表的RDD。听起来这就是你想要的。我不是java-spark用户,因此我无法为您提供语法细节。 Check here获取有关语法
的帮助