如果当前值为 null,则获取上一个非 null 值 - Azure Databricks

Get the previous not null value if the current value is null - Azure databricks

提问人:John Bryan 提问时间:11/16/2023 更新时间:11/16/2023 访问量:88

问:

我有一个表,其中包含以下值

ID   Date        FinalDate
1    20120101     NULL
1    20120201     20120201
1    20120301     NULL
1    20120401     20120401
1    20120501     NULL
1    20120601     NULL

我希望让输出表显示这个

ID   Date        FinalDate
1    20120101     NULL
1    20120201     20120201
1    20120301     20120201
1    20120401     20120401
1    20120501     20120401
1    20120601     20120401

在第一个 not null 值之后,任何 null 值都应选取上一个 not null 值。此示例只有 1 个 ID,但我有多个具有相同场景的 ID。

有人可以向我提供有关如何在 sql、python 或 pyspark 中编写代码以在 databricks 上实现此目的的任何帮助。我是新手,所以任何帮助将不胜感激。

python sql pyspark azure-databricks

评论


答:

0赞 mpr 11/16/2023 #1

尝试使用以下代码来获得所需的输出 -

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

df.withColumn("FinalDate", func.last('FinalDate', True).over(Window.partitionBy('ID').orderBy('Date'))).show()
0赞 DileeprajnarayanThumula 11/16/2023 #2

我尝试了一个使用pyspark的例子:

from pyspark.sql import SparkSession
from pyspark.sql import Window
from pyspark.sql import functions as F
data = [
    (1, 20120101, None),
    (1, 20120201, 20120201),
    (1, 20120301, None),
    (1, 20120401, 20120401),
    (1, 20120501, None),
    (1, 20120601, None),
    (2, 20120101, None),
    (2, 20120201, 20120201),
    (2, 20120301, None),
    (2, 20120401, 20120401),
    (2, 20120501, None),
    (2, 20120601, None)
]
schema = ["ID", "Date", "FinalDate"]
Dilip_df = spark.createDataFrame(data, schema=schema)
window_spec = Window.partitionBy("ID").orderBy("Date")
result_df = Dilip_df.withColumn(
    "FinalDate",
    F.coalesce("FinalDate", F.last("FinalDate", True).over(window_spec))
)
result_df.show()

结果:

+---+--------+---------+
| ID|    Date|FinalDate|
+---+--------+---------+
|  1|20120101|     NULL|
|  1|20120201| 20120201|
|  1|20120301| 20120201|
|  1|20120401| 20120401|
|  1|20120501| 20120401|
|  1|20120601| 20120401|
|  2|20120101|     NULL|
|  2|20120201| 20120201|
|  2|20120301| 20120201|
|  2|20120401| 20120401|
|  2|20120501| 20120401|
|  2|20120601| 20120401|
+---+--------+---------+
  • 上面的代码使用 coalesce 函数和最后一个窗口函数,用同一“ID”分区中的最后一个非 null 值填充“FinalDate”列中的 null 值。

  • 定义窗口规范以按“ID”对数据进行分区,并按“日期”对数据进行排序。(window_spec)

  • withColumn 方法用于创建新列“FinalDate”,其中 null 值将替换为同一“ID”分区中的最后一个非 null 值。

  • 这是使用 coalesce 函数和最后一个 窗口函数和指定的窗口规范。