火花更换行号

时间:2018-10-12 15:12:02

标签: scala apache-spark

我是新来的火花。我有一个问题,例如 first pic 每行的第一个数字是行号,其他的是集合。 我只需要更改行号,例如,所有行号加1更改为 second pic 我该怎么办?谢谢!

4 个答案:

答案 0 :(得分:0)

在Spark中,RDD和数据帧是不可变的,这意味着您无法更改它们。您可以做的就是应用转换并创建新转换。

根据其声音,您想应用alist.stream() .peek(logIfNeeded(verbose)) .forEach(/*dostuff*/); ,这将使您可以根据需要变换每一行。这是一个非常基本的转换,您可以在documentation中找到无数的示例。

答案 1 :(得分:0)

首先将数据读入数据框, 然后只需在第一列上添加1即可进行转换

val df = spark.read....
val df1 = df.withColumn("firstcolumn", $"firstcolumn"+1)
df1.show

例如

scala> val df = Seq((0,1),(1,2),(2,3)).toDF("c1","c2")
df: org.apache.spark.sql.DataFrame = [c1: int, c2: int]

scala> df.show
+---+---+
| c1| c2|
+---+---+
|  0|  1|
|  1|  2|
|  2|  3|
+---+---+


scala> df.withColumn("c1",$"c1"+1).show
+---+---+
| c1| c2|
+---+---+
|  1|  1|
|  2|  2|
|  3|  3|
+---+---+

答案 2 :(得分:0)

val s = scala.io.Source.fromFile("C:\\scala\\txt\\firstPic.txt").getLines.toList
val s1 = s.map(x=>x.split(" ").toList).map(v=>v.map(_.toInt)).
         map{case Nil => Nil; case h::t => h+1::t}

此后,我们可以从列表s1构造数据框

在REPL中测试:

scala> val s = scala.io.Source.fromFile("C:\\scala\\txt\\firstPic.txt").getLines.toList
s: List[String] = List(0 1 3 4, 1 2 5 7 8, 2 3 4, 3 1)
scala> val s1 = s.map(x=>x.split(" ").toList).map(v=>v.map(_.toInt)).map{case Nil => Nil;case h::t => h+1::t}
s1: List[List[Int]] = List(List(1, 1, 3, 4), List(2, 2, 5, 7, 8), List(3, 3, 4), List(4, 1))

scala> s.foreach(x=>println(x))
0 1 3 4
1 2 5 7 8
2 3 4
3 1

scala> s1.foreach(x=>println(x.mkString(" ")))
1 1 3 4
2 2 5 7 8
3 3 4
4 1

答案 3 :(得分:0)

使用模式匹配。

scala> val a = scala.io.Source.fromFile("data.txt").getLines.toList
a: List[String] = List(0 1 3 4, 1 2 5 7 8, 2 3 4, 3 1)

scala> val pat = "(^\\d+)(.+)".r
pat: scala.util.matching.Regex = (^\d+)(.+)

scala> val c = a.map(p=> p match { case pat(x,y) => x.toInt+1+y } )
c: List[String] = List(1 1 3 4, 2 2 5 7 8, 3 3 4, 4 1)

scala> c.foreach(println)
1 1 3 4
2 2 5 7 8
3 3 4
4 1

scala>