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

Scala 如何重写下面的代码以便获得预期的输出,scala,apache-spark,Scala,Apache Spark,目标是从AmazonS3读取已知文件的列表,并在s3中的某个输出路径上创建一个文件。每个文件都是选项卡分隔的。我必须从每行中提取第一个元素,并按递增顺序为它指定一个数值。数值和元素应在将要创建的新文件中用制表符分隔。我使用spark和scala在RDD上执行操作 预期产量 1 qwerty 2 asdf … … 67892341 ghjk 电流输出 1 qwerty 2 asdf … … 456721 tyui 1 sdfg 2 swerr … … 263523 gkfk … … 512346

目标是从AmazonS3读取已知文件的列表,并在s3中的某个输出路径上创建一个文件。每个文件都是选项卡分隔的。我必须从每行中提取第一个元素,并按递增顺序为它指定一个数值。数值和元素应在将要创建的新文件中用制表符分隔。我使用spark和scala在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")
 }

看起来您只需要:


您正在尝试索引表中的每一行?zipWithIndex().map(row=>row.swap).sortByKey(true).map(row=>row.\u 1+“\t”+row.\u 2)。在添加上述代码后,我能够获得所需的输出。谢谢你的帮助。@zizouraj太棒了。很高兴这有帮助。
val myRDD = 
  sc
   .textFile("s3://mybucket/fileFormatregex")
   .map(col => col(0))
   .zipWithIndex()
   .map(_.swap)
   .sortByKey(true)
   .repartition(1)
   .saveAsTextFile("s3://mybucket/outputPath")