当前位置: 首页 > 知识库问答 >
问题:

SparkSql如果值为null则取前一个值

薄瑞
2023-03-14

所以我有了这个数据表

+---+-------------+-----+
| id|    timestamp|  num|
+---+-------------+-----+
| 10|1546300799000| 37.5|
| 10|1546300800000| null|
| 10|1546300801000| null|
| 10|1546300802000|37.51|
| 20|1546300804000| null|
| 10|1546300806000| 37.5|
| 10|1546300807000| null|
+---+-------------+-----+
+---+-------------+-----+
| id|    timestamp|  num|
+---+-------------+-----+
| 10|1546300799000| 37.5|
| 10|1546300800000| 37.5|
| 10|1546300801000| 37.5|
| 10|1546300802000|37.51|
| 20|1546300804000| null|
| 10|1546300806000| 37.5|
| 10|1546300807000| 37.5|
+---+-------------+-----+
w = Window.partitionBy('id').orderBy('timestamp')
final = joined.withColumn('num2', when(col('num').isNull(), lag(col('num')).over(w)).otherwise(col('num')))
+---+-------------+-----+-----+
| id|    timestamp|  num| num2|
+---+-------------+-----+-----+
| 10|1546300799000| 37.5| 37.5|
| 10|1546300800000| null| 37.5|
| 10|1546300801000| null| null|
| 10|1546300802000|37.51|37.51|
| 20|1546300804000| null| null|
| 10|1546300806000| 37.5| 37.5|
| 10|1546300807000| null| 37.5|
+---+-------------+-----+-----+

正如您所看到的,如果值为null,则获取前一个值,但是如果您查看第三行,我将获得一个null,我假设是因为它获取了第二行的值,但是当它仍然没有更新时(因此仍然是来自原始dataframe的null)。

我有点不知道该怎么做。有人帮忙吗?

共有1个答案

赵高韵
2023-03-14

你期待着向前填充一个措施,不幸的是,不是什么内置与Pyspark因为它是与熊猫。但有一个变通办法。

from pyspark.sql import functions as F
from pyspark.sql.window import Window

 window = Window.partitionBy('id')\
           .orderBy('timestamp')\
           .rowsBetween(Window.unboundedPreceding, Window.currentRow)

 final = joined.\
               withColumn('numFilled', F.last('num',ignorenulls = True).over(window)

因此,它所做的就是基于分区键和order列构造窗口。它还告诉窗口回看以前的行,直到当前行。最后,在每一行,您返回最后一个非空值(根据您的窗口记住,这包括您的当前行)

 类似资料:
  • 问题内容: 我有一个表,其中有一个带有默认值的列: 有一个存储过程插入到: 您可以看到,我必须有条件地分支以便我的插入使用默认值(如果为null)。仅一列就可以了,但是请考虑是否有更多列-语法可能很笨拙。 我是否可以使用一种语法来指定插入值应该返回默认值(如果为null)?我尝试了以下操作,但可以理解的是语法错误: 问题答案:

  • 我想要两个表上的连接,如果值为NULL,则复制左连接行为,如果值为NOULL,则复制内连接行为。例如,对于表: 该联接将返回一行值(根据左联接)。对于表格: 不会返回任何行(根据内部联接)。对于表格: 将返回值为的单行(根据两种联接类型)。 最有效的方法是什么? 编辑:作为效率最大化的一部分,我正在寻找一个不进行后期筛选的查询(即使用子句)。

  • 默认情况下,MapStruct将NullValueMappingStrategy作为RETURN_NULL。我的要求是,当source为null时,我需要抛出一个NPE,类似于lombok的@nonnull的工作方式。

  • 只有当新值不为null时,我才会更新集合设置值。我有这样一个代码: 有没有一个简单的方法可以做到这一点? 另一种方法:如果我可以从我获取数据的表单的占位符中获取值,我可以解决这个问题...但是这可能吗?

  • 如果值为空,则需要在单元格中显示一个不间断的空格。这是我的模板: 我试过这个,但不管用: 它返回值的问题是: 如果许可证号带有值,则单元格为空,行颜色如下所示。 利用卢库马的建议,它表明了这一点: 更改筛选器中的if语句后,仍然不显示非值:

  • 我在创造一个小游戏。所以现在我有了一个只有5行的JTable。 单击按钮后,我希望保存表中的值。我的问题是,最后一个值每次都为null。 例 Val来自表:user1,user2,user3,user4,user5 预期输出:[user1,user2,user3,user4,user5] 输出:[user1,user2,user3,user4,null] 这就是我从表中获取数据的方式 可运行示例