Python Pypark动力柱计算

Python Pypark动力柱计算,python,hadoop,apache-spark,pyspark,Python,Hadoop,Apache Spark,Pyspark,下面是我的spark数据框 a b c 1 3 4 2 0 0 4 1 0 2 2 0 我的输出应该如下 a b c 1 3 4 2 0 2 4 1 -1 2 2 3 公式是prev(c)-b+a即4-2+0=2和2-4+1=-1 有人能帮我跨过这道障碍吗?希望这会有帮助 from pyspark.sql.functions import lag, udf from pyspark.sql.types import IntegerType from pyspark.sql.window im

下面是我的spark数据框

a b c
1 3 4
2 0 0
4 1 0
2 2 0
我的输出应该如下

a b c
1 3 4
2 0 2
4 1 -1
2 2 3
公式是
prev(c)-b+a
4-2+0=2
2-4+1=-1

有人能帮我跨过这道障碍吗?

希望这会有帮助

from pyspark.sql.functions import lag, udf
from pyspark.sql.types import IntegerType
from pyspark.sql.window import Window

numbers = [[1,2,3],[2,3,4],[3,4,5],[5,6,7]]
df = sc.parallelize(numbers).toDF(['a','b','c'])
df.show()

w = Window().partitionBy().orderBy('a')
calculate = udf(lambda a,b,c:a-b+c,IntegerType())
df = df.withColumn('result', lag("a").over(w)-df.b+df.c)
df.show()



+---+---+---+
|  a|  b|  c|
+---+---+---+
|  1|  2|  3|
|  2|  3|  4|
|  3|  4|  5|
|  5|  6|  7|
+---+---+---+

+---+---+---+------+
|  a|  b|  c|result|
+---+---+---+------+
|  1|  2|  3|  null|
|  2|  3|  4|     2|
|  3|  4|  5|     3|
|  5|  6|  7|     4|
+---+---+---+------+
导入pyspark.sql.f函数
从pyspark.sql.window导入窗口
df=sc.parallelize([
[1,3],
[2,0],
[4,1],
[2,2]
]).toDF(('a','b'))
df1=df.withColumn(“row\u id”,f.单调地增加\u id())
w=Window.partitionBy().orderBy(f.col(“行id”))
df1=df1。带列(“c_temp”,f.when(f.col(“row_id”)==0,f.lit(4))。否则(-f.col(“a”)+f.col(“b”))
df1=df1.带列(“c”,f.sum(f.col(“c\U temp”))。超过(w))。下降(“c\U temp”,“行id”)
df1.show()
输出为:

+---+---+---+
|  a|  b|  c|
+---+---+---+
|  1|  3|  4|
|  2|  0|  2|
|  4|  1| -1|
|  2|  2| -1|
+---+---+---+
希望这能有所帮助

导入pyspark.sql.f函数
从pyspark.sql.window导入窗口
df=sc.parallelize([
[1,3],
[2,0],
[4,1],
[2,2]
]).toDF(('a','b'))
df1=df.withColumn(“row\u id”,f.单调地增加\u id())
w=Window.partitionBy().orderBy(f.col(“行id”))
df1=df1。带列(“c_temp”,f.when(f.col(“row_id”)==0,f.lit(4))。否则(-f.col(“a”)+f.col(“b”))
df1=df1.带列(“c”,f.sum(f.col(“c\U temp”))。超过(w))。下降(“c\U temp”,“行id”)
df1.show()
输出为:

+---+---+---+
|  a|  b|  c|
+---+---+---+
|  1|  3|  4|
|  2|  0|  2|
|  4|  1| -1|
|  2|  2| -1|
+---+---+---+

假设您已经尝试做一些事情来解决此问题。请告诉我们你想做什么。那么,你有什么问题?你已经有了精确的公式,你可以很容易地搜索如何获得以前的值以及如何对字段进行求和我在下面使用的方法,该方法创建了新列c_new,滞后1,并进行了c_new-a+b分析。这些值必须从以前生成的c_new值中动态获取。下面是代码df=df.withColumn('c_new',func.lag(df['c'])。over(Window.partitionBy('a')。orderBy('a'))df=df.withColumn('Stock_new'),(df['c_new']-Stock_output_table['a'])+Stock_output_table['b'])我被困在这里,不知道如何动态地从c_new获取值。假设您已经尝试做了一些事情来解决这个问题。请告诉我们你想做什么。那么,你有什么问题?你已经有了精确的公式,你可以很容易地搜索如何获得以前的值以及如何对字段进行求和我在下面使用的方法,该方法创建了新列c_new,滞后1,并进行了c_new-a+b分析。这些值必须从以前生成的c_new值中动态获取。下面是代码df=df.withColumn('c_new',func.lag(df['c'])。over(Window.partitionBy(“a”).orderBy(“a”))df=df.withColumn('Stock_new'),(df['c_new']-Stock_output_table['a'])Stock_output__table['b'])我被困在这里,不知道如何动态地从c_newThanks那里获取值来回答。但是,如果我的数据帧是这样的,那么这就不起作用了:数字=[[1,1,2,3],[1,1,2,3,3,4,5],[3,3,4,5],[3,3,4,5],[4,5,6,7]]df=sc.parallelize(数字)。toDF(['cat','a','b','c'])w=Window partitionBy().orderBy('cat')df df withColumn('result',lag('a')over df(w)-df.b+df.c)。我应该采取任何明确的结尾,请帮助它的工作只是罚款给我。。。如果你的数据集在上面,你能帮我上面给出的数据集吗是的,它对我来说很好。。。根据你的公式prev(a)-b+c。你能告诉我你得到了什么错误吗?如果我使用这个数据集编号=[[1,1,2,3],[1,1,2,3],[2,2,3,4],[3,3,4,5],[3,3,4,5],[3,3,4,5],我不会得到任何错误‌​,[4,5,6,7]] . 第三行的3 4 5输出未正确复制。输出应为3 3 4 5 5。但是得到3 3 4 5 4。公式无法正确复制答案有很多。但是,如果我的数据帧是这样的,那么这就不起作用了:数字=[[1,1,2,3],[1,1,2,3,3,4,5],[3,3,4,5],[3,3,4,5],[4,5,6,7]]df=sc.parallelize(数字)。toDF(['cat','a','b','c'])w=Window partitionBy().orderBy('cat')df df withColumn('result',lag('a')over df(w)-df.b+df.c)。我应该采取任何明确的结尾,请帮助它的工作只是罚款给我。。。如果你的数据集在上面,你能帮我上面给出的数据集吗是的,它对我来说很好。。。根据你的公式prev(a)-b+c。你能告诉我你得到了什么错误吗?如果我使用这个数据集编号=[[1,1,2,3],[1,1,2,3],[2,2,3,4],[3,3,4,5],[3,3,4,5],[3,3,4,5],我不会得到任何错误‌​,[4,5,6,7]] . 第三行的3 4 5输出未正确复制。输出应为3 3 4 5 5。但是得到3 3 4 5 4。公式无法正确复制