如何重写下面的代码,以便获得预期的输出

时间:2016-10-17 12:42:42

标签: scala apache-spark

目标是从amazon s3中读取已知文件列表,并在某个输出路径中在s3中创建单个文件。每个文件都是分隔符。我必须从每一行中提取第一个元素,并按递增顺序为其分配一个数值。数值和元素应在要创建的新文件中以制表符分隔。我使用带scala的spark来对RDD执行操作。

预期输出

1 qwerty
2 asdf
...
...
67892341 ghjk

当前输出

1 qwerty
2 asdf
...
...
456721 tyui
1 sdfg
2 swerr
...
...
263523 gkfk
...
...
512346 ghjk

因此,基本上当计算在分布式集群上进行时,全局变量counter将在每台机器上启动。如何重写代码以便获得所需的输出。以下是代码段。

    def getReqCol() = {
     val myRDD = sc.textFile("s3://mybucket/fileFormatregex")
     var counter = 0
     val mbLuidCol = myRDD.map(x => x.split("\t")).map(col =>col(0)).map(row => {
       def inc(acc : Int) = {
         counter = acc + 1
       }
     inc(counter)
     counter + "\t" + row
   })
   row.repartition(1).saveAsTextFile("s3://mybucket/outputPath")
 }

1 个答案:

答案 0 :(得分:1)

看起来您需要的只是RDD.zipWithIndex()

val myRDD = 
  sc
   .textFile("s3://mybucket/fileFormatregex")
   .map(col => col(0))
   .zipWithIndex()
   .map(_.swap)
   .sortByKey(true)
   .repartition(1)
   .saveAsTextFile("s3://mybucket/outputPath")