Spark:如何合并转换

时间:2016-10-25 04:34:45

标签: java json apache-spark rdd

我有1000个json文件,我需要对每个文件进行一些转换,然后创建一个合并的输出文件,它可以对值进行重叠操作(例如,它不应该有重复的值)

因此,如果我将文件读作wholeTextFilestitle,content对,然后在map函数中,我会将content解析为json tree并执行转换,在哪里以及如何合并输出?

我是否需要对结果RDD进行另一次转换以合并值,这将如何工作?我可以在所有地图块中有一个共享对象(List或Map或RDD(?)),它们将作为转换的一部分进行更新,以便我可以检查那里的重复值吗?

P.S:即使输出创建了部分文件,我仍然希望没有重复。

代码:

//read the files as JavaPairRDD , which gives <filename, content> pairs
String filename = "/sample_jsons";
JavaPairRDD<String,String> distFile = sc.wholeTextFiles(filename);

//then create a JavaRDD from the content.
JavaRDD<String> jsonContent = distFile.map(x -> x._2);

//apply transformations, the map function will return an ArrayList which would
//have property names.

JavaRDD<ArrayList<String>> apm = jsonContent.map(
                new Function< String, ArrayList<String> >() {
                            @Override
                            public ArrayList<String> call(String arg0) throws Exception {

                                JsonNode rootNode = mapper.readTree(arg0);
                                return parseJsonAndFindKey(rootNode, "type", "rootParent");
                            }
                });

因此,通过这种方式,我可以从每个json文件中获取ArrayList中的所有第一级属性。

现在我需要一个最终ArrayList,作为所有这些arraylists的联合,删除重复。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:0)

为什么1000个json文件需要1000个RDD?

您是否看到将输入阶段的1000个json文件合并到一个RDD中的任何问题?

如果你将从输入阶段使用一个RDD,那么在这个RDD上执行所有必需的操作应该不难。