列的 Scala dataframe 值到另一列
Scala dataframe value of column into another column
我想将前一个 id 的值赋给紧接的下一个 id。
例如,"id1" 的值为 "ab","id2" 的值为 "ac"。
我想得到输出 "id2" 有值 "ab" "ac".
我的数据框 df 如下:
id value1
id1 ab
id1 ab
id2 ac
id2 ac
id3 abc
id3 abc
id3 abc
期望的输出
id value1 value2
id1 ab
id1 ab
id2 ac ab
id2 ac ab
id3 abc ac
id3 abc ac
id3 abc ac
我使用了以下脚本
val w1 = Window.orderBy("id")
val snDF = df.withColumn("value2", lag($"value1", 2).over(w1))
但它给了我:
id value1 value2
id1 ab
id1 ab
id2 ac ab
id2 ac ab
id3 abc ac
id3 abc ac
id3 abc abc
这不是正确的输出。我怎么才能得到它 ?
谢谢
执行以下操作应该适合您
import org.apache.spark.sql.expressions._
val w1 = Window.orderBy("id")
import org.apache.spark.sql.functions._
df.groupBy("id", "value1")
.agg(collect_list("value1").as("temp"))
.withColumn("value2", lag($"value1", 1).over(w1))
.withColumn("temp", explode(col("temp")))
.drop("temp")
.show(false)
你会得到数据框
+---+------+------+
|id |value1|value2|
+---+------+------+
|id1|ab |null |
|id1|ab |null |
|id2|ac |ab |
|id2|ac |ab |
|id3|abc |ac |
|id3|abc |ac |
|id3|abc |ac |
+---+------+------+
我想将前一个 id 的值赋给紧接的下一个 id。
例如,"id1" 的值为 "ab","id2" 的值为 "ac"。
我想得到输出 "id2" 有值 "ab" "ac".
我的数据框 df 如下:
id value1
id1 ab
id1 ab
id2 ac
id2 ac
id3 abc
id3 abc
id3 abc
期望的输出
id value1 value2
id1 ab
id1 ab
id2 ac ab
id2 ac ab
id3 abc ac
id3 abc ac
id3 abc ac
我使用了以下脚本
val w1 = Window.orderBy("id")
val snDF = df.withColumn("value2", lag($"value1", 2).over(w1))
但它给了我:
id value1 value2
id1 ab
id1 ab
id2 ac ab
id2 ac ab
id3 abc ac
id3 abc ac
id3 abc abc
这不是正确的输出。我怎么才能得到它 ?
谢谢
执行以下操作应该适合您
import org.apache.spark.sql.expressions._
val w1 = Window.orderBy("id")
import org.apache.spark.sql.functions._
df.groupBy("id", "value1")
.agg(collect_list("value1").as("temp"))
.withColumn("value2", lag($"value1", 1).over(w1))
.withColumn("temp", explode(col("temp")))
.drop("temp")
.show(false)
你会得到数据框
+---+------+------+
|id |value1|value2|
+---+------+------+
|id1|ab |null |
|id1|ab |null |
|id2|ac |ab |
|id2|ac |ab |
|id3|abc |ac |
|id3|abc |ac |
|id3|abc |ac |
+---+------+------+