我正在学习与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
我了解这是对原始点击率的总和,但我希望按照说明进行分组,但仍然希望获得预期的点击率值。我也不想更改列名,因为它正在更改我的方法。
是否有可能以这种方式进行计算。我也有#Purchases
和CoversionRate
(#Purchases / Views),我也想在该字段中做同样的事情。任何线索将不胜感激。
您可以在汇总后计算点击率。尝试下面的代码。
ds.groupBy("Region","Id","RecId")
.agg(sum(col("Views")).as("Views"), sum(col("Clicks")).as("Clicks"))
.withColumn("CTR" , col("Views") / col("Clicks"))
.show()