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|
+---+----------+----------+---------+
在此处检查答案:否则请提供有关问题和数据集的更多详细信息