Java 将顺序码转换为并行码

Java 将顺序码转换为并行码,java,python,mapreduce,apache-spark,Java,Python,Mapreduce,Apache Spark,我正试图用Spark理解MapReduce。 当做一些简单的练习时,我没有问题,按顺序进行,但是当涉及到并行代码时,我遇到了困难 考虑以下示例: var = "Far far away, behind the word mountains, far from the countries Vokalia and Consonantia, there live the blind texts." k = 10; for x in range(0, len(var)): print(var[

我正试图用Spark理解MapReduce。
当做一些简单的练习时,我没有问题,按顺序进行,但是当涉及到并行代码时,我遇到了困难

考虑以下示例:

var = "Far far away, behind the word mountains, far from the countries Vokalia and Consonantia, there live the blind texts."
k = 10;

for x in range(0, len(var)):
    print(var[0+x:k+x])
它将文本拆分为10个字符()。
使用Spark将其“转换”为并行代码的正确方法是什么

如何为循环编码
?Spark提供环路吗

我只需要理解整个概念


PS:我已经阅读了文档,我知道什么是RDD等。我只是不知道如何将顺序代码“转换”为并行代码。

正如您可能已经阅读过的,Spark具有丰富的功能API。RDD操作分为
转换
操作
,其中
转换
可被视为获取RDD并生成RDD的函数:
f(RDD)=>RDD
,操作可被视为获取RDD并生成某些结果的函数(
Array[T]
如果是
收集
单位
如果是
foreach

关于如何将某个算法移植到Spark的总体思路是,通过组合转换和操作以实现预期结果,找到一种使用Spark支持的功能范式表达所述算法的方法

依赖于序列的算法,如上面的w-shingling,对并行化提出了挑战,因为元素顺序中存在隐式依赖,有时很难表达,这是一种可以在不同分区中操作的方式

在本例中,我使用索引作为保留序列的一种方式,同时使算法能够以转换的方式表达:

def kShingle(rdd:RDD[Char], n:Int): RDD[Seq[Char]] = {
    def loop(base: RDD[(Long, Seq[Char])], cumm: RDD[(Long, Seq[Char])], i: Int): RDD[Seq[Char]] = {
       if (i<=1) cumm.map(_._2) else {
        val segment =  base.map{case (idx, seq) => (idx-1, seq)}
        loop(segment, cumm.join(segment).map{case (k,(v1,v2)) => (k,v1 ++ v2)}, i-1)
        }
    }
    val seqRdd = rdd.map(char => Seq(char))
    val indexed = seqRdd.zipWithIndex.map(_.swap)

    loop(indexed, indexed, n)
}
val rdd = sc.parallelize("Floppy Disk")
scala> kShingle(rdd,3).collect
res23: Array[Seq[Char]] = Array(List(F, l, o), List(i, s, k), List(l, o, p), List(o, p, p), List(p, p, y), List(p, y,  ), List(y,  , D), List( , D, i), List(D, i, s))