我们如何使用 Apache Spark scala 对 txt 文件中的数据进行逐行排序?
how we can sort line by line data from txt file using Apache Spark scala?
log.txt 文件包含:
cat,black,dog,apple,red
zoo,apple,red,blue,green
apple,green,zoo,black,walk
我的代码是:
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.rdd.RDD
object ScalaApp {
def main(args: Array[String]) {
val sc = new SparkContext("local[4]", "Program")
val data = sc.textFile("data.txt").flatMap(line=> line.split(","))
val d1=data.map(_.sorted)
d1.foreach(print _)
}
}
我想要以下结果:
apple,black,cat,dog,red
apple,blue,green,red,zoo
apple,black,green,walk,zoo
但我的代码给出的结果是:
actabckldgoaelppderoozaelppderbelueegnraelppeegnroozabcklaklw
请提供任何解决方案!
必须先按行分割,再按","
val data = sc.textFile("data.txt")
.map(word=> word.split(",")).map(_.sorted)
data.collect()
尝试将定义 d1
的行更改为:
val d1=data.map(_.sorted)
d1.foreach(println _)
这应该创建一个 RDD[Array[String]]
,其中 RDD
的每个元素都是一个数组,其中包含按升序排序的一行文本的标记:
val data = sc.textFile("log.txt").map(line => line.split(",").sorted)
此外,请注意,如果您执行 data.foreach(println)
,输出将转到工作人员的标准输出,而不是驱动程序的标准输出。
but my code give result as :
actabckldgoaelppderoozaelppderbelueegnraelppeegnroozabcklaklw
你弄得一团糟,因为 data
是一个 RDD[String]
(因为你做的是 flatMap
而不是 map
。)所以当你这样做时data.map(_.sorted)
它将对 data
中的每个 String
进行排序,例如"apple" 将变为 "aelpp",等等。使用 map
而不是 flatMap
。
终于解决了这个问题,也想和大家分享一下:
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.rdd.RDD
object ScalaApp {
def main(args: Array[String]) {
val sc = new SparkContext("local[4]", "Program")
val data = sc.textFile("data.txt").flatMap(_.split("\n"))
val lc=data.count().toInt
val d1=data.flatMap(line=>line.split(",").sorted)
d1.foreach(println)
val a=d1.toArray
var loop=0
for(i<-0 to lc-1){
println(a(loop)+" "+a(loop+1)+" "+a(loop+2)+" "+a(loop+3)+" "+a(loop+4)+" "+a(loop+5))
loop=loop+6
}
}
}
data.txt 文件包含:
cat,black,dog,apple,red,cat
zoo,apple,red,blue,green,cat
apple,green,zoo,black,walk,cat
结果是:
apple black cat cat dog red
apple blue cat green red zoo
apple black cat green walk zoo
这就是想要的输出!!
log.txt 文件包含:
cat,black,dog,apple,red
zoo,apple,red,blue,green
apple,green,zoo,black,walk
我的代码是:
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.rdd.RDD
object ScalaApp {
def main(args: Array[String]) {
val sc = new SparkContext("local[4]", "Program")
val data = sc.textFile("data.txt").flatMap(line=> line.split(","))
val d1=data.map(_.sorted)
d1.foreach(print _)
}
}
我想要以下结果:
apple,black,cat,dog,red
apple,blue,green,red,zoo
apple,black,green,walk,zoo
但我的代码给出的结果是:
actabckldgoaelppderoozaelppderbelueegnraelppeegnroozabcklaklw
请提供任何解决方案!
必须先按行分割,再按","
val data = sc.textFile("data.txt")
.map(word=> word.split(",")).map(_.sorted)
data.collect()
尝试将定义 d1
的行更改为:
val d1=data.map(_.sorted)
d1.foreach(println _)
这应该创建一个 RDD[Array[String]]
,其中 RDD
的每个元素都是一个数组,其中包含按升序排序的一行文本的标记:
val data = sc.textFile("log.txt").map(line => line.split(",").sorted)
此外,请注意,如果您执行 data.foreach(println)
,输出将转到工作人员的标准输出,而不是驱动程序的标准输出。
but my code give result as :
actabckldgoaelppderoozaelppderbelueegnraelppeegnroozabcklaklw
你弄得一团糟,因为 data
是一个 RDD[String]
(因为你做的是 flatMap
而不是 map
。)所以当你这样做时data.map(_.sorted)
它将对 data
中的每个 String
进行排序,例如"apple" 将变为 "aelpp",等等。使用 map
而不是 flatMap
。
终于解决了这个问题,也想和大家分享一下:
import org.apache.spark.SparkContext
import org.apache.spark.SparkContext._
import org.apache.spark.rdd.RDD
object ScalaApp {
def main(args: Array[String]) {
val sc = new SparkContext("local[4]", "Program")
val data = sc.textFile("data.txt").flatMap(_.split("\n"))
val lc=data.count().toInt
val d1=data.flatMap(line=>line.split(",").sorted)
d1.foreach(println)
val a=d1.toArray
var loop=0
for(i<-0 to lc-1){
println(a(loop)+" "+a(loop+1)+" "+a(loop+2)+" "+a(loop+3)+" "+a(loop+4)+" "+a(loop+5))
loop=loop+6
}
}
}
data.txt 文件包含:
cat,black,dog,apple,red,cat
zoo,apple,red,blue,green,cat
apple,green,zoo,black,walk,cat
结果是:
apple black cat cat dog red
apple blue cat green red zoo
apple black cat green walk zoo
这就是想要的输出!!