如何正确使用mapPartitions函数

时间:2018-12-04 19:11:04

标签: scala apache-spark intellij-idea-2016

我正在做一个具有大数据的程序,这就是为什么我使用Spark和Scala的原因。我需要对数据库进行分区,为此我使用

var data0 = conf.dataBase.repartition (8) .persist (StorageLevel.MEMORY_AND_DISK_SER)

但是然后我需要在分区中做一些事情,然后再继续处理与该分区相对应且我使用的数据库

var tester = data0.mapPartitions {x =>
   configFuzzyPredProblem ()
   Strategy.getStrategy.executeStrategy (conf.iterByRun, 5, GeneratorType.HillClimbing)
 } .persist (StorageLevel.MEMORY_AND_DISK_SER)

在方法executeStrategy()中,我使用数据库,但是我不知道它是全局分区还是对应于该分区的分区。我怎么知道我正在使用哪一个,然后只对该分区的数据库执行分区处理?

1 个答案:

答案 0 :(得分:2)

这是一个使用mapPartitionsWithIndex的简单示例,该示例遵循mapPartitions的相同规则-不包括索引方面。

您可以看到在mapPartitions内部需要处理一个可交互对象,在此示例中为Interator Int。在这种情况下,在您的情况8中,使用一些条目或可能为零的条目处理了3个分区。

val rdd1 = sc.parallelize(List(1,2,3,4,5,6,7,8,9,10), 3)
def myfunc(index: Int, iter: Iterator[Int]) : Iterator[String] = {
    iter.map(x => index + "," + x)
}
val rdd2 = rdd1.mapPartitionsWithIndex(myfunc)

我在您的函数内部看不到,但是我认为这没问题,它将处理一个分区-数据库的一部分。