Scala将数据帧的值转换为另一列

时间:2018-04-05 09:37:04

标签: scala apache-spark apache-spark-sql window-functions

我想将前一个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

这不是正确的输出。我怎么才能得到它 ?

谢谢

1 个答案:

答案 0 :(得分:0)

执行以下操作应该适合您

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    |
+---+------+------+