假设我有以下DataFrame。
+----+-----+
|lang|count|
+----+-----+
| en| 4|
| en| 5|
| de| 2|
| en| 2|
| nl| 4|
| nl| 5|
+----+-----+
如何将每种唯一语言的“count”值相加,并将此值附加为新列(因此,不减少行数)?
在我的例子中,这将导致:
+----+-----+----------------+
|lang|count|totalCountInLang|
+----+-----+----------------+
| en| 4| 11|
| en| 5| 11|
| de| 2| 2|
| en| 2| 11|
| nl| 4| 9|
| nl| 5| 9|
+----+-----+----------------+
DataFrame是通过map
上的DStream
操作构建的。
有关实现此目标的最佳方法的任何建议?有没有比使用DataFrame更有效的方法?
提前致谢!
答案 0 :(得分:4)
您可以使用以下其中一项:
在窗口上总结:
import org.apache.spark.sql.expressions.Window
val df = Seq(
("en", 4), ("en", 5), ("de", 2),
("en", 2), ("nl", 4), ("nl", 5)
).toDF("lang", "count")
val w = Window.partitionBy("lang").rowsBetween(
Window.unboundedPreceding, Window.unboundedFollowing
)
df.withColumn("totalCountInLang", sum("count").over(w))
聚合和加入:
df.join(df.groupBy("lang").sum(), Seq("lang"))
对于小组,前一种解决方案应该表现得稍好一些。对于较大的,通常提供后者,可选地与广播功能相结合。