Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pypark-”的英文缩写;递归的;涉及最后一天的活动_Python_Algorithm_Recursion_Pyspark - Fatal编程技术网

Python Pypark-”的英文缩写;递归的;涉及最后一天的活动

Python Pypark-”的英文缩写;递归的;涉及最后一天的活动,python,algorithm,recursion,pyspark,Python,Algorithm,Recursion,Pyspark,我正在pyspark中处理一个进程,我有一个数据帧,我试图再添加一列(使用withColumn方法) 问题是公式是: 状态1=如果“今天的PETP”>0,则“最后一天的状态1”+“今天的PETP”否则为0 Status1的每个结果都涉及最后一天结果中的Status1 我找到的一个解决方案是创建一个pandas数据框,并逐个运行记录,直到我可以使用变量计算每个记录。但是,我会有性能问题。你能帮忙吗 考虑数据帧列:日期(每日)/PETP(浮动)/STATUS1?(浮动) 我真的很感激任何帮助 我认为

我正在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|
+----+----+------+---------------+-------+

我希望这就是您想要的。

你好,马丁,谢谢您的回答。问题是您创建的状态列本身取决于最后一天的状态。如果不引用最后一个号码,则此号码不存在。明白了吗?恐怕我不明白你的意思。请使用输入数据框和预期输出更新您的问题。