2016-12-28 87 views
1

我有一個下面的要求來聚合斯卡拉Spark數據框上的數據。Spark數據幀數據聚合

我有一個兩列火花數據框。

mo_id sales 
201601 11.01 
201602 12.01 
201603 13.01 
201604 14.01 
201605 15.01 
201606 16.01 
201607 17.01 
201608 18.01 
201609 19.01 
201610 20.01 
201611 21.01 
201612 22.01 

如上所示,數據框有兩列'mo_id'和'sales'。 我想添加一個新的列(agg_sales)到應該有銷售總額到當前月份的數據框,如下所示。

mo_id sales agg_sales 
201601 10 10 
201602 20 30 
201603 30 60 
201604 40 100 
201605 50 150 
201606 60 210 
201607 70 280 
201608 80 360 
201609 90 450 
201610 100 550 
201611 110 660 
201612 120 780 

說明:

對於一個月201603個agg_sales將會從201601到201603. 銷售的總和爲201604個本月將agg_sales是銷售的總和從201601到201604. 等。

任何人都可以請幫助做到這一點。

版本使用:星火1.6.2和Scala 2.10

+0

你的意思是'銷售'被格式化爲第一個數據集還是第二個? –

+0

我有兩列第一個數據幀。 – Ramesh

+0

因此,在下一個數據框中,我想添加一個新列(agg_sales)。 – Ramesh

回答

1

您正在尋找的累加值可與窗函數來完成:

scala> val df = sc.parallelize(Seq((201601, 10), (201602, 20), (201603, 30), (201604, 40), (201605, 50), (201606, 60), (201607, 70), (201608, 80), (201609, 90), (201610, 100), (201611, 110), (201612, 120))).toDF("id","sales") 
df: org.apache.spark.sql.DataFrame = [id: int, sales: int] 

scala> import org.apache.spark.sql.expressions.Window 
import org.apache.spark.sql.expressions.Window 

scala> val ordering = Window.orderBy("id") 
ordering: org.apache.spark.sql.expressions.WindowSpec = [email protected] 

scala> df.withColumn("agg_sales", sum($"sales").over(ordering)).show 
16/12/27 21:11:35 WARN WindowExec: No Partition Defined for Window operation! Moving all data to a single partition, this can cause serious performance degradation. 
+------+-----+-------------+ 
| id|sales| agg_sales | 
+------+-----+-------------+ 
|201601| 10|   10| 
|201602| 20|   30| 
|201603| 30|   60| 
|201604| 40|   100| 
|201605| 50|   150| 
|201606| 60|   210| 
|201607| 70|   280| 
|201608| 80|   360| 
|201609| 90|   450| 
|201610| 100|   550| 
|201611| 110|   660| 
|201612| 120|   780| 
+------+-----+-------------+ 

請注意,我在id定義的ordering s,你可能會想要某種時間戳來訂購總和。

+0

謝謝。讓我嘗試。 – Ramesh

+0

_No分區定義爲窗口操作!將所有數據移動到一個分區_ – user7337271

+0

只是一個警告,不需要擔心它(如果你的數據足夠大,不必擔心分區,你可能已經定義了一個) –