在 PySpark 中为每一行查找最新的非空值

Posted

技术标签:

【中文标题】在 PySpark 中为每一行查找最新的非空值【英文标题】:Find latest non null value for each row in PySpark 【发布时间】:2019-08-29 10:51:04 【问题描述】:

我有一个像这样的 PySpark 数据框,

+----------+------+------+------+------+------+------+------+------+------+------+------+------+------+
|id        |201806|201807|201808|201809|201810|201811|201812|201901|201902|201903|201904|201905|201906|
+----------+------+------+------+------+------+------+------+------+------+------+------+------+------+
|  1       |    15|    15|    15|    15|    15|    15|    15|    15|    15|  null|    15|    15|    15|
|  2       |     4|     4|     4|     4|     4|     4|     4|     4|     4|     4|     4|     4|     4|
|  3       |     7|     7|     7|     7|     7|     7|     7|     7|  null|  null|  null|  null|  null|
-------------------------------------------------------------------------------------------------------

从这些数据中,我想为每一行找到最新的非空值。

我希望得到以下结果。

+----------+------+
|id.         |latest|
+----------+------+
|  1       |    15| 
|  2       |     4|  
|  3       |     7|  
-------------------

我关注了这个answer,但我无法按行执行操作。

我用过,

df.select([last(x, ignorenulls=True).alias(x) for x in df.columns])

但此代码仅按列执行,我希望按行执行相同的操作。

【问题讨论】:

你尝试过什么? 我已经更新了...... 【参考方案1】:

假设您的列是从最旧到最新排序的,您可以使用下面使用coalesce 的代码来获取最新值。

from pyspark.sql.functions import coalesce

df.select('id', coalesce(*[i for i in df.columns[::-1] if i != 'id']).alias('latest')).show()

输出:

+---+------+
| id|latest|
+---+------+
|  1|    15|
|  2|     4|
|  3|     7|
+---+------+

【讨论】:

以上是关于在 PySpark 中为每一行查找最新的非空值的主要内容,如果未能解决你的问题,请参考以下文章

计算Spark DataFrame中的非空值的数量

在除前两列之外的每列上前向填充具有最新非空值的空值

如何在 PySpark 中用该列的第一个非空值填充该列的空值

Pyspark 计数非空值之间的空值

从 Pyspark 中的数据框中计算空值和非空值

返回 MIN 和 MAX 值并忽略空值 - 使用前面的非空值填充空值