目标是从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")
}
答案 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")