Scala 如何重写下面的代码以便获得预期的输出
目标是从AmazonS3读取已知文件的列表,并在s3中的某个输出路径上创建一个文件。每个文件都是选项卡分隔的。我必须从每行中提取第一个元素,并按递增顺序为它指定一个数值。数值和元素应在将要创建的新文件中用制表符分隔。我使用spark和scala在RDD上执行操作 预期产量 1 qwertyScala 如何重写下面的代码以便获得预期的输出,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
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")