Python Pypark-”的英文缩写;递归的;涉及最后一天的活动
我正在pyspark中处理一个进程,我有一个数据帧,我试图再添加一列(使用withColumn方法) 问题是公式是: 状态1=如果“今天的PETP”>0,则“最后一天的状态1”+“今天的PETP”否则为0 Status1的每个结果都涉及最后一天结果中的Status1 我找到的一个解决方案是创建一个pandas数据框,并逐个运行记录,直到我可以使用变量计算每个记录。但是,我会有性能问题。你能帮忙吗 考虑数据帧列:日期(每日)/PETP(浮动)/STATUS1?(浮动)Python Pypark-”的英文缩写;递归的;涉及最后一天的活动,python,algorithm,recursion,pyspark,Python,Algorithm,Recursion,Pyspark,我正在pyspark中处理一个进程,我有一个数据帧,我试图再添加一列(使用withColumn方法) 问题是公式是: 状态1=如果“今天的PETP”>0,则“最后一天的状态1”+“今天的PETP”否则为0 Status1的每个结果都涉及最后一天结果中的Status1 我找到的一个解决方案是创建一个pandas数据框,并逐个运行记录,直到我可以使用变量计算每个记录。但是,我会有性能问题。你能帮忙吗 考虑数据帧列:日期(每日)/PETP(浮动)/STATUS1?(浮动) 我真的很感激任何帮助 我认为
我真的很感激任何帮助 我认为解决方案的关键是函数。试试这个(为了简单起见,我假设所有列都是整数数据): 首先,将列向上移动一天
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|
+----+----+------+---------------+-------+
我希望这就是您想要的。你好,马丁,谢谢您的回答。问题是您创建的状态列本身取决于最后一天的状态。如果不引用最后一个号码,则此号码不存在。明白了吗?恐怕我不明白你的意思。请使用输入数据框和预期输出更新您的问题。