You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Apache Spark结合类型与子类型分组:基于指定数据集的实现问询

在Apache Spark中结合类型(media)与子类型(action)分组的实现方案

嘿,这事儿其实很容易扩展你现有的代码!你已经掌握了按city和media分组的方法,要结合media(类型)和action(子类型)分组,主要有两种常见的实现方式,我给你详细拆解下:

方案1:直接将action加入分组键

最直接的方式就是把action字段也添加到groupBy的参数列表里,这样就能实现按城市、媒体类型、操作子类型的组合维度进行分组。如果你还是想统计每组的条数,可以继续用count();如果需要对amount做聚合(比如求和),可以换成sum("amount")这类函数。

代码示例

// 按city、media、action分组,统计每组的记录数
val groupByCityMediaAction = sales
  .groupBy("city", "media", "action")
  .count()

groupByCityMediaAction.show()

输出示例

+-------+--------+------+-----+
|   city|   media|action|count|
+-------+--------+------+-----+
| Warsaw|facebook| share|    1|
| Warsaw|facebook|  like|    1|
| Boston| twitter| share|    1|
| Boston|facebook| share|    1|
|Toronto| twitter|  like|    1|
+-------+--------+------+-----+

如果需要聚合amount字段(比如求和),可以修改成这样:

val groupByWithSum = sales
  .groupBy("city", "media", "action")
  .sum("amount")
  .withColumnRenamed("sum(amount)", "total_amount") // 重命名聚合结果列

groupByWithSum.show()

对应输出

+-------+--------+------+------------+
|   city|   media|action|total_amount|
+-------+--------+------+------------+
| Warsaw|facebook| share|         100|
| Warsaw|facebook|  like|         200|
| Boston| twitter| share|          50|
| Boston|facebook| share|         150|
|Toronto| twitter|  like|          50|
+-------+--------+------+------------+

方案2:将media和action合并为一个组合字段后分组

如果你希望把“类型+子类型”作为一个单独的分组维度(比如生成facebook_share这样的组合标识),可以先通过concat函数创建一个新列,再基于这个新列分组。

代码示例

import org.apache.spark.sql.functions.concat_ws

// 先创建media和action的组合列,再分组
val groupedWithCombinedType = sales
  .withColumn("media_action", concat_ws("_", $"media", $"action")) // 用下划线连接两个字段
  .groupBy("city", "media_action")
  .sum("amount")
  .withColumnRenamed("sum(amount)", "total_amount")

groupedWithCombinedType.show()

输出示例

+-------+-------------+------------+
|   city|media_action |total_amount|
+-------+-------------+------------+
| Warsaw|facebook_share|         100|
| Warsaw|facebook_like |         200|
| Boston|twitter_share |          50|
| Boston|facebook_share|         150|
|Toronto|twitter_like  |          50|
+-------+-------------+------------+

这两种方案都能满足你“结合类型与子类型分组”的需求,你可以根据实际的业务展示需求来选择~

内容的提问来源于stack exchange,提问作者ds_user

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:35:57