[英]Window function with dynamic lag
我正在查看Spark SQL中Spark DataFrame的窗口幻燈片功能。
我有一個帶有id
, month
和volume
的數據框。
id month volume new_col
1 201601 100 0
1 201602 120 100
1 201603 450 220
1 201604 200 670
1 201605 121 870
現在我想用的名字添加一個新列new_col
,價值new_col
是的總和volume
和new_col
當前行前,如上圖所示。 new_col
第一行的值將為零。
我嘗試通過使用PySpark使用窗口功能lag
的以下選項。 但是我發現new_col
列將被遞歸使用。 僅使用lag
函數的方法無法做到這一點:
window = Window.partitionBy(F.col('id')).orderBy(F.col('month').asc())
df.withColumn('new_col', F.lag(col('volume'), 1).over(window) + F.lag(col('new_col'), 1).over(window))
有沒有一種方法可以通過使用窗口函數來動態滯后new_col
? 還是有其他好的解決方案?
您可以在一個窗口上使用lag
和sum
來實現此目的。 sum
,如果用在窗口會自動計算cumsum。 下面的代碼將首先滯后於volume
列,然后求和,但也可以按相反的順序進行操作。
window = Window.partitionBy(F.col('id')).orderBy(F.col('month').asc())
df.withColumn('new_col', F.sum(F.lag(col('volume'), 1, 0).over(window)).over(window))
您可以使用嵌套窗口功能
>>> from pyspark.sql.window import Window
>>> import pyspark.sql.functions as F
>>>
>>> data = sc.parallelize([
... (1,'201601',100),
... (1,'201602',120),
... (1,'201603',450),
... (1,'201604',200),
... (1,'201605',121)])
>>> col = ['id','month', 'volume']
>>>
>>> df = spark.createDataFrame(data, col)
>>> df.show()
+---+------+------+
| id| month|volume|
+---+------+------+
| 1|201601| 100|
| 1|201602| 120|
| 1|201603| 450|
| 1|201604| 200|
| 1|201605| 121|
+---+------+------+
>>> window1 = Window.partitionBy('id').orderBy('month')
>>> window2 = Window.partitionBy('id').orderBy('month').rangeBetween(Window.unboundedPreceding, 0)
>>> df = df.withColumn('new_col', F.sum(F.lag('volume').over(window1)).over(window2)).na.fill({'new_col': 0})
>>> df.show()
+---+------+------+-------+
| id| month|volume|new_col|
+---+------+------+-------+
| 1|201601| 100| 0|
| 1|201602| 120| 100|
| 1|201603| 450| 220|
| 1|201604| 200| 670|
| 1|201605| 121| 870|
+---+------+------+-------+
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.