рассчитать агрегацию и процентное соотношение после groupBy в Scala / Набор данных Spark / Dataframe - PullRequest
0 голосов
/ 30 октября 2019

Я учусь работать со 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

Я понимаю, что он суммирует весь CTR из оригинала, но я хочу, чтобы groupBy, как объяснено, все же хотел получить ожидаемое значение CTR. Я также не хочу менять имена столбцов, поскольку они меняются в моем подходе.

Существует ли какой-либо возможный способ вычисления таким образом. У меня также есть #Purchases и CoversionRate (# Закупки / просмотры), и я хочу сделать то же самое с этим полем. Любые выводы будут оценены.

1 Ответ

0 голосов
/ 30 октября 2019

Вы можете рассчитать CTR после агрегации. Попробуйте следующий код.

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

...