如何使用Spark并行化列表列表?

时间:2016-04-19 17:29:59

标签: java hadoop apache-spark hdfs

假设我读了整个文件:

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()时,我得到了一个列表列表。

这样做的一种方法是:如何单独为每个字符串并行化这个列表列表,而不是单独为每个列表并行化?

1 个答案:

答案 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获取有关语法

的帮助