我正在做一个具有大数据的程序,这就是为什么我使用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()
中,我使用数据库,但是我不知道它是全局分区还是对应于该分区的分区。我怎么知道我正在使用哪一个,然后只对该分区的数据库执行分区处理?
答案 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)
我在您的函数内部看不到,但是我认为这没问题,它将处理一个分区-数据库的一部分。