使用 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 获取上一行的值的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Apache Spark 中获取上一行的数据

在 MySQL 视图中获取上一行的值

在scala./Spark代码中获取NullPointerException

根据上一行中的值获取百分比

根据两个文本列排序的 SQL 获取下一行和上一行

我们可以在数据帧的每一行上使用 spark sql 函数吗?