在scala / Spark数据集/数据帧中的groupBy之后同时计算聚合和百分比

问题描述 投票:0回答:1

我正在学习与Scala和Spark合作。这是我第一次使用它们。我有一些结构化的Scala DataSet(org.apache.spark.sql.Dataset),例如以下格式。

Region | Id | RecId | Widget | Views | Clicks |  CTR
1      | 1  | 101   |   A    |  5    |    1   |  0.2
1      | 1  | 101   |   B    | 10    |    4   |  0.4
1      | 1  | 101   |   C    |  5    |    1   |  0.2
1      | 2  | 401   |   A    |  5    |    1   |  0.2
1      | 2  | 401   |   D    | 10    |    2   |  0.1

NOTE: CTR = Clicks/Views

我想与小部件无关地合并映射(即使用Region,Id,RecID)。

我想要的预期输出如下:

Region | Id | RecId | Views | Clicks |  CTR
1      | 1  | 101   | 20    |    6   |  0.3
1      | 1  | 101   | 15    |    3   |  0.2

什么我正在得到如下所示:

>>> ds.groupBy("Region","Id","RecId").sum().show()
Region | Id | RecId | sum(Views) | sum(Clicks) |  sum(CTR)
1      | 1  | 101   | 20         |    6        |  0.8
1      | 1  | 101   | 15         |    3        |  0.3

我了解这是对原始点击率的总和,但我希望按照说明进行分组,但仍然希望获得预期的点击率值。我也不想更改列名,因为它正在更改我的方法。

是否有可能以这种方式进行计算。我也有#PurchasesCoversionRate(#Purchases / Views),我也想在该字段中做同样的事情。任何线索将不胜感激。

scala group-by apache-spark-sql
1个回答
0
投票

您可以在汇总后计算点击率。尝试下面的代码。

ds.groupBy("Region","Id","RecId") .agg(sum(col("Views")).as("Views"), sum(col("Clicks")).as("Clicks")) .withColumn("CTR" , col("Views") / col("Clicks")) .show()

© www.soinside.com 2019 - 2024. All rights reserved.