使用 spark sql 获取上一行的值
Posted
技术标签:
【中文标题】使用 spark sql 获取上一行的值【英文标题】:Get the previous row value using spark sql 【发布时间】:2020-04-08 04:26:40 【问题描述】:我有一张这样的桌子。
Id prod val
1 0 0
2 0 0
3 1 1000
4 0 0
5 1 2000
6 0 0
7 0 0
我想添加一个新列new_val
,该列的条件是,如果prod = 0
,那么new_val
应该来自prod = 1
的前一行。
如果prod = 1
它应该与val
列具有相同的值。如何使用 spark sql 实现这一目标?
Id prod val new_val
1 0 0 1000
2 0 0 1000
3 1 1000 1000
4 0 0 2000
5 1 2000 2000
6 1 4000 4000
7 1 3000 3000
非常感谢任何帮助
【问题讨论】:
你可以查看post 【参考方案1】:你可以这样使用:
import pyspark.sql.functions as F
from pyspark.sql.window import Window
w = Window().orderBy("id")
df = df.withColumn("new_val", F.when(F.col("prod") == 0, F.lag("val").over(w)).otherwise(F.col("val")))
我们基本上在做的是使用 if-else 条件:
当prod
== 0 时,取val
中的lag
是前一行的值(在按id
列排序的窗口上),如果prod
== 1,那么我们使用列的现值。
【讨论】:
谢谢。如果前一个值也是 0 怎么办。我想从 prod=1 的前一行中提取第一个值 这很难@Sujatha,我会考虑的。给我一些时间【参考方案2】:你可以做到这一点
val w = Window.orderBy("id").rowsBetween(0, Window.unboundedFollowing)
df
.withColumn("new_val", when($"prod" === 0, null).otherwise($"val"))
.withColumn("new_val", first("new_val", ignoreNulls = true).over(w))
首先,只要值不变,就使用 null
值创建新列:
+---+----+----+-------+
| id|prod| val|new_val|
+---+----+----+-------+
| 1| 0| 0| null|
| 2| 0| 0| null|
| 3| 1|1000| 1000|
| 4| 0| 0| null|
| 5| 1|2000| 2000|
| 6| 1|4000| 4000|
| 7| 1|3000| 3000|
+---+----+----+-------+
它用以下记录中的第一个非空值替换值
+---+----+----+-------+
| id|prod| val|new_val|
+---+----+----+-------+
| 1| 0| 0| 1000|
| 2| 0| 0| 1000|
| 3| 1|1000| 1000|
| 4| 0| 0| 2000|
| 5| 1|2000| 2000|
| 6| 1|4000| 4000|
| 7| 1|3000| 3000|
+---+----+----+-------+
【讨论】:
以上是关于使用 spark sql 获取上一行的值的主要内容,如果未能解决你的问题,请参考以下文章