我正在pyspark中处理一个具有数据帧的进程,并且尝试添加更多列(使用withColumn方法)。
问题在于公式为:
STATUS1 =如果“今天的PETP”> 0,则“最后一天的Status1” +“今天的PETP”,否则为0
Status1的每个结果都涉及前一天结果中的status1。
我发现的一个解决方案是创建一个熊猫数据框并逐个运行记录,直到我可以使用变量计算每个记录为止。但是我会遇到性能问题。你能帮忙吗?
考虑数据框列:日期(每天)/ PETP(浮动)/ STATUS1? (浮动)
非常感谢您的帮助!
答案 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|
+----+----+------+---------------+-------+
我希望那是你想要的。