在Spark中,在没有过滤RDD两次的情况下处理RDD中的2个子组的有效方法是什么?

时间:2016-05-11 22:29:21

标签: apache-spark mapreduce

我有一个大型RDD。我需要把它分成两组。第一组我需要存储到磁盘,第二组我需要进一步处理然后存储到磁盘。现在我用2个过滤器实现了这个目标。我想过使用一个小组但不确定这会有什么帮助(实际上它甚至可能导致很多不必要的改组)。

我们假设我有以下JavaPairRDD<Boolean, SomeClass> rdd让我们假设有true键的记录构成了rdd的99%。此外,让我们假设rdd很大。

  • 我需要将false值的记录存储在磁盘上。
  • 我需要使用true值的记录进行进一步处理。

我可以执行以下操作(psudo-code)

JavaPairRDD<Boolean, SomeClass> truthy = rdd.filter(selectTrueKeys());
JavaPairRDD<Boolean, SomeClass> falsy = rdd.filter(selectFalseKeys());

falsy
    .map(prepareForStorage())
    .saveAsNewAPIHadoopDataset(job.getConfiguration());

truthy
    .map(mapToSomethingElse())
    .combineByKey(create, combine, merge)
    .map(prepareForStorage())
    .saveAsNewAPIHadoopDataSet(job.getConfiguration());

过滤整套两次似乎很浪费。我想过用密钥对rdd进行分组。但我认为这也无济于事。

0 个答案:

没有答案