提问人:John Bryan 提问时间:11/16/2023 更新时间:11/16/2023 访问量:88
如果当前值为 null,则获取上一个非 null 值 - Azure Databricks
Get the previous not null value if the current value is null - Azure databricks
问:
我有一个表,其中包含以下值
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 上实现此目的的任何帮助。我是新手,所以任何帮助将不胜感激。
答:
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 函数和最后一个 窗口函数和指定的窗口规范。
评论