列的Scala数据框值到另一列

Posted

技术标签:

【中文标题】列的Scala数据框值到另一列【英文标题】:Scala dataframe value of column into another column 【发布时间】:2018-04-05 09:37:04 【问题描述】:

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

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

谢谢

【问题讨论】:

我想将最后一个 id 的值分配给下一个 id 例如“d2”是一个 id,它的值为“ac”,我想创建另一列 sn2 并分配一个值(“ab”)以前的 id ("d1")。 【参考方案1】:

执行以下操作应该对您有用

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

【讨论】:

以上是关于列的Scala数据框值到另一列的主要内容,如果未能解决你的问题,请参考以下文章

Scala Spark,比较两个 DataFrame 并选择另一列的值

批处理文件:将两列的字符串组合到另一列中

Scala Spark Dataframe 创建一个新列,其中包含另一列的最大先前值和当前值

EXCEL如何提取重复的数据到另一列

基于Scala中另一列的值映射RDD列

根据另一列值更新数据框的列