在 Pyspark Interactive Shell 中查找列的增量
Posted
技术标签:
【中文标题】在 Pyspark Interactive Shell 中查找列的增量【英文标题】:Finding the Delta of a Column within Pyspark Interactive Shell 【发布时间】:2020-10-24 20:48:34 【问题描述】:我有这个数据框:
DataFrame[visitors: int, beach: string, Date: date]
有以下数据:
+-----------+-------------+--------+
|date |beach |visitors|
+-----------+------------+---------+
|2020-03-02 |Bondi Beach |205 |
|2020-03-02 |Nissi Beach |218 |
|2020-03-03 |Bar Beach |201 |
|2020-03-04 |Navagio |102 |
|2020-03-04 |Champangne |233 |
|2020-03-05 |Lighthouse |500 |
|2020-03-06 |Mazo |318 |
+-----------+------------+---------+
我正在寻找使用访问者列中的数据来查找这些列的增量。 预期输出:
+-----------+-------------+--------+-------+
|date |beach |visitors| Delta |
+-----------+------------+---------+-------+
|2020-03-02 |Bondi Beach |205 |-13 | (205-218)
|2020-03-02 |Nissi Beach |218 |17 | (218-201)
|2020-03-03 |Bar Beach |201 |99 | (201-102)
|2020-03-04 |Navagio |102 |-131 | (102-233)
|2020-03-04 |Champangne |233 |-267 | (233-500)
|2020-03-05 |Lighthouse |500 |182 | (500-318)
|2020-03-06 |Mazo |318 |318 | (318-0)
+-----------+------------+---------+-------+
【问题讨论】:
【参考方案1】:您可以使用lead
函数来解决您的问题。由于最后一行的lead
是null
,所以我使用coalesce
函数将nulls
替换为访问者的列。
from pyspark.sql.window import Window
from pyspark.sql.functions import *
w=Window().orderBy("date")
df.withColumn("delta", col("visitors") - lead("visitors").over(w))\
.withColumn('delta', coalesce('delta', 'visitors')).show()
+----------+-----------+--------+-----+
| date| beach|visitors|delta|
+----------+-----------+--------+-----+
|2020-03-02|Bondi Beach| 205| -13|
|2020-03-02|Nissi Beach| 218| 17|
|2020-03-03| Bar Beach| 201| 99|
|2020-03-04| Navagio| 102| -131|
|2020-03-04| Champangne| 233| -267|
|2020-03-05| Lighthouse| 500| 182|
|2020-03-06| Mazo| 318| 318|
+----------+-----------+--------+-----+
注意:我只是按date
字段排序。最好在 order by 子句中包含另一列(如 id),以便保持顺序。此外,使用没有分区的窗口可能会对性能产生影响。
【讨论】:
以上是关于在 Pyspark Interactive Shell 中查找列的增量的主要内容,如果未能解决你的问题,请参考以下文章