Scala Spark数据帧数据聚合
我在scala中聚合Spark dataframe上的数据有以下要求 我有一个带两列的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
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列。(月号、销售额、总销售额)检查我下面的答案谢谢。让我试试。没有为窗口操作定义分区!将所有数据移动到单个分区只是一个警告,无需担心(如果您的数据足够大,您可能已经定义了一个分区)是的,在我正在处理的实际数据集中,有一列我可以选择作为分区键。谢谢