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