Pyspark-涉及最后一天的“递归”功能

时间:2018-08-30 20:02:34

标签: python algorithm recursion pyspark

我正在pyspark中处理一个具有数据帧的进程,并且尝试添加更多列(使用withColumn方法)。

问题在于公式为:

  

STATUS1 =如果“今天的PETP”> 0,则“最后一天的Status1” +“今天的PETP”,否则为0

Status1的每个结果都涉及前一天结果中的status1。

我发现的一个解决方案是创建一个熊猫数据框并逐个运行记录,直到我可以使用变量计算每个记录为止。但是我会遇到性能问题。你能帮忙吗?

考虑数据框列:日期(每天)/ PETP(浮动)/ STATUS1? (浮动)

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我认为您解决方案的关键是lag函数。试试这个(为简单起见,我假设所有列都是整数数据):

首先,将列向上移动一天

import pyspark
from pyspark.sql import SparkSession
from pyspark import SparkContext
import pandas as pd
from pyspark.sql import functions as F
from pyspark.sql import Window

sc = SparkContext.getOrCreate()
spark = SparkSession(sc)

columns = ['date', 'petp', 'status']
data = [(0, 0, 0), (1, 1, 1), (2, 2, 2), (3,3,3), (4,4,4), (5,5,5)]
pd_data = pd.DataFrame.from_records(data=data, columns=columns)
spark_data = spark.createDataFrame(pd_data)

spark_data_with_lag = spark_data.withColumn("status_last_day", F.lag("status", 1, 0).over(Window.orderBy("date")))
spark_data_with_lag.show()

+----+----+------+---------------+
|date|petp|status|status_last_day|
+----+----+------+---------------+
|   1|   1|     1|              0|
|   2|   2|     2|              1|
|   3|   3|     3|              2|
|   4|   4|     4|              3|
|   5|   5|     5|              4|
+----+----+------+---------------+

然后在您的条件条件下使用该数据

status2 = spark_data_with_lag.withColumn("status2", F.when(F.col("date") > 0, F.col("petp") + F.col("status_last_day")).otherwise(0))
status2.show()

+----+----+------+---------------+-------+
|date|petp|status|status_last_day|status2|
+----+----+------+---------------+-------+
|   1|   1|     1|              0|      1|
|   2|   2|     2|              1|      3|
|   3|   3|     3|              2|      5|
|   4|   4|     4|              3|      7|
|   5|   5|     5|              4|      9|
+----+----+------+---------------+-------+

我希望那是你想要的。