我有一个如下的数据帧
+----------+-----------+
|START_DATE|FINISH_DATE|
+----------+-----------+
|2017-01-02| 2022-09-18|
|2022-09-19| 2025-03-04|
|2025-03-05| 2027-09-14|
|2027-09-15| 2028-12-06|
|2028-12-07| 2031-08-28|
+----------+-----------+
要求比较连续行的开始日期和结束日期。下一行的开始日期应仅比上一行的结束日期多1。对于dataframe中的所有行,如果下一行的开始日期仅比上一行的结束日期多1,则应返回True。(此函数应在数据帧级别而不是行级别返回true)
我使用了滞后窗口分析函数
dfu = df.withColumn('user', lit('user')) //df is the above dataframe
windowPartition = Window.partitionBy("user").orderBy("START_DATE")
df_lag =dfu.withColumn('prev_row_startdate',F.lag(dfu['START_DATE'],-1).over(windowPartition))
df_lag_drp=df_lag.na.drop()
下面是本报告的输出
+----------+-----------+----+------------------+
|START_DATE|FINISH_DATE|user|prev_row_startdate|
+----------+-----------+----+------------------+
|2017-01-02| 2022-09-18|user| 2022-09-19|
|2022-09-19| 2025-03-04|user| 2025-03-05|
|2025-03-05| 2027-09-14|user| 2027-09-15|
|2027-09-15| 2028-12-06|user| 2028-12-07|
+----------+-----------+----+------------------+
我已经写了一个lambda函数来计算差异,但是得到了下面的错误
TypeError:无法推断类型的架构:<;类“datetime.timedelta”>
df_dif=df_lag_drp.rdd.map(lambda x: (x["prev_row_startdate"]-x["FINISH_DATE"]))
我知道我需要一个lambda函数,它可以迭代“df_lag_drp”数据帧的每一行,并且应该能够找到“prev_row_startdate”和“start_date”之间的差异,如果每一行的差异仅为1,那么它应该返回true,否则返回false,但我确实被困在这个问题上。 请告诉我是否有其他有效的方法来实现这一点。我正在使用Python3.9和spark3.x
您应该尽可能使用内置的SQL函数
datediff
正是您想要的:https://spark.apache.org/docs/latest/api/sql/index.html#datediff然后可以聚合结果(使用
.agg(F.max(F.col('delta_date')))
),并检查每个user
组的结果是否等于一相关问题 更多 >
编程相关推荐