2017-10-27 14 views
0

を使用してPySparkで累積合計を計算:は、私は次のサンプルデータフレームを持つウィンドウ関数に

rdd = sc.parallelize([(1,20), (2,30), (3,30)]) 
df2 = spark.createDataFrame(rdd, ["id", "duration"]) 
df2.show() 

+---+--------+ 
| id|duration| 
+---+--------+ 
| 1|  20| 
| 2|  30| 
| 3|  30| 
+---+--------+ 

私は期間のDESCのために、このデータフレームを並べ替えると期間の累積和を持つ新しい列を追加します。だから私は、次のようでした:

windowSpec = Window.orderBy(df2['duration'].desc()) 

df_cum_sum = df2.withColumn("duration_cum_sum", sum('duration').over(windowSpec)) 

df_cum_sum.show() 

+---+--------+----------------+ 
| id|duration|duration_cum_sum| 
+---+--------+----------------+ 
| 2|  30|    60| 
| 3|  30|    60| 
| 1|  20|    80| 
+---+--------+----------------+ 

私の所望の出力は次のとおりです。

+---+--------+----------------+ 
| id|duration|duration_cum_sum| 
+---+--------+----------------+ 
| 2|  30|    30| 
| 3|  30|    60| 
| 1|  20|    80| 
+---+--------+----------------+ 

私はこれを取得するにはどうすればよいですか?ここで

は内訳です:

+--------+----------------+ 
|duration|duration_cum_sum| 
+--------+----------------+ 
|  30|    30| #First value 
|  30|    60| #Current duration + previous cum sum value 
|  20|    80| #Current duration + previous cum sum value  
+--------+----------------+ 

答えて

0

あなたはネクタイを破るためにrow_numberを導入することができます。書面による場合sql

df2.selectExpr(
    "id", "duration", 
    "sum(duration) over (order by row_number() over (order by duration desc)) as duration_cum_sum" 
).show() 

+---+--------+----------------+ 
| id|duration|duration_cum_sum| 
+---+--------+----------------+ 
| 2|  30|    30| 
| 3|  30|    60| 
| 1|  20|    80| 
+---+--------+----------------+ 
関連する問題