在pyspark交互式shell中查找列的增量

8cdiaqws  于 2021-05-19  发布在  Spark
关注(0)|答案(1)|浏览(430)

我有这个Dataframe:

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)
+-----------+------------+---------+-------+
mrfwxfqh

mrfwxfqh1#

你可以用 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 现场。最好在ORDERBY子句中包含像id这样的另一列,以便保持顺序。另外,使用没有分区的窗口可能会影响性能。

相关问题