大清单FlatMap Java Spark

时间:2016-07-25 17:38:00

标签: java list apache-spark

我在JavaPairRDD<Integer, List<String>>中有一个很大的列表,我想做一个flatMap来获取列表条目的所有可能组合,以便最终得到JavaPairRDD<Integer, Tuple2<String,String>>。基本上如果我有像

这样的东西

(1, ["A", "B", "C"])

我想得到:

(1, <"A","B">) (1, <"A", "C">) (1, <"B", "C")

问题在于大型列表,因为我所做的是通过在输入列表上嵌套循环来创建大量的Tuple2对象。有时这个列表不适合内存。我发现了这个,但不确定如何在Java中实现它: Spark FlatMap function for huge lists

2 个答案:

答案 0 :(得分:2)

您可能需要RDD列表,然后在过滤相同值之前加入JavaPairRDD<Integer, List<String>> original = // ... JavaPairRDD<Integer, String> flattened = original.flatMapValues(identity()); JavaPairRDD<Integer, Tuple2<String, String>> joined = flattened.join(flattened); JavaPairRDD<Integer, Tuple2<String, String>> filtered = joined.filter(new Function<Tuple2<Integer, Tuple2<String, String>>, Boolean> () { @Override public Boolean call(Tuple2<Integer, Tuple2<String, String>> kv) throws Exception { return kv._2()._1().equals(kv._2()._2()); } });

atom
coordinateX coordinateY coordinateZ
atom
coordinateX coordinateY coordinateZ
...

答案 1 :(得分:1)

取决于你的数据集有多大,在我的工作中它通常需要处理100-200GB数据集,使用FlatMap和flatMapToPair都能正常用于高密度计算。以下示例

JavaPairRDD<Integer, List<String>>= DatasetsRDD.
    .flatMapToPair(x->{
    return xx;
    });

此外,如果您的数据集很大,您可以尝试使用spark persistance to disk

Storage Level   

    MEMORY_ONLY
    MEMORY_ONLY_SER 
    MEMORY_AND_DISK_SER 
    DISK_ONLY
    MEMORY_ONLY_2

References: https://spark.apache.org/docs/latest/rdd-programming-guide.html