Scala Spark数据帧数据聚合

Scala Spark数据帧数据聚合,scala,apache-spark,Scala,Apache Spark,我在scala中聚合Spark dataframe上的数据有以下要求 我有一个带两列的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 如上所示,数据框有两列“MOU

我在scala中聚合Spark dataframe上的数据有以下要求

我有一个带两列的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
如上所示,数据框有两列“MOU 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_销售额将为201601至201603年的销售额之和。 2016年4月的agg_销售额为2016年1月至2016年4月的销售额总和。 等等

谁能帮忙做这件事


版本使用:Spark 1.6.2和Scala 2.10

您正在寻找可通过窗口函数实现的累积总和:

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 = org.apache.spark.sql.expressions.WindowSpec@75d454a4

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
s上定义了
ordering
,您可能需要某种时间戳来对求和进行排序。

您的意思是将
sales
格式化为第一个数据集还是第二个数据集?我有一个包含两列的第一个数据帧。因此,在下一个数据帧中,我想添加一个新列(agg\u sales).所以在新数据集中,我总共有3列。(月号、销售额、总销售额)检查我下面的答案谢谢。让我试试。没有为窗口操作定义分区!将所有数据移动到单个分区只是一个警告,无需担心(如果您的数据足够大,您可能已经定义了一个分区)是的,在我正在处理的实际数据集中,有一列我可以选择作为分区键。谢谢