pyspark滞后函数(基于列)

pyspark滞后函数(基于列),pyspark,Pyspark,我想实现以下目标 lag(第1列,datediff(第2列,第3列)).over(窗口) 偏移量是动态的。我也尝试过使用UDF,但没有成功 如何实现上述功能?函数的参数count采用整数而不是列对象: psf.lag(列,计数=1,默认值=None) 因此,它不能是“动态”值。 相反,您可以在列中构建滞后,然后将表本身连接起来 首先,让我们创建数据框架: df=spark.createDataFrame( 并行化( [[1, "2011-01-01"], [1, "2012-01-01"],

我想实现以下目标

lag(第1列,datediff(第2列,第3列)).over(窗口)

偏移量是动态的。我也尝试过使用UDF,但没有成功


如何实现上述功能?

函数的参数
count
采用整数而不是列对象:

psf.lag(列,计数=1,默认值=None)
因此,它不能是“动态”值。 相反,您可以在列中构建滞后,然后将表本身连接起来

首先,让我们创建数据框架:

df=spark.createDataFrame(
并行化(
[[1, "2011-01-01"], [1, "2012-01-01"], [2, "2013-01-01"], [1, "2014-01-01"]]
), 
[“int”,“date”]
)
我们要枚举行:

从pyspark.sql导入窗口
将pyspark.sql.functions作为psf导入
df=df.withColumn(
“身份证”,
psf.单调递增的id()
)
w=Window.orderBy(“id”)
df=df.withColumn(“rn”,psf.row_number()。在(w)上方)
+---+----------+-----------+---+
|int |日期| id | rn|
+---+----------+-----------+---+
|  1|2011-01-01|17179869184|  1|
|  1|2012-01-01|42949672960|  2|
|  2|2013-01-01|68719476736|  3|
|  1|2014-01-01|94489280512|  4|
+---+----------+-----------+---+
现在来构建滞后:

df1=df.select(
“int”,
df.date.别名(“date1”),
(df.rn-df.int).别名(“rn”)
)
df2=df.select(
df.date.别名(“date2”),
“rn”
)
最后,我们可以加入它们并计算日期差:

df1.join(df2,“rn”,“inner”).withColumn(
“日期差异”,
psf.datediff(“日期1”、“日期2”)
).drop(“rn”)
+---+----------+----------+---------+
|国际|日期1 |日期2 |日期|差异|
+---+----------+----------+---------+
|  1|2012-01-01|2011-01-01|      365|
|  2|2013-01-01|2011-01-01|      731|
|  1|2014-01-01|2013-01-01|      365|
+---+----------+----------+---------+
在此处检查答案:否则请提供有关问题和数据集的更多详细信息