Я новичок в Spark SQL, и я хочу рассчитать процент в моих данных с каждым статусом. Вот мои данные, как показано ниже:
A B
11 1
11 3
12 1
13 3
12 2
13 1
11 1
12 2
Итак, я могу сделать это в SQL следующим образом:
select (C.oneTotal / C.total) as onePercentage,
(C.twoTotal / C.total) as twotPercentage,
(C.threeTotal / C.total) as threPercentage
from (select count(*) as total,
A,
sum(case when B = '1' then 1 else 0 end) as oneTotal,
sum(case when B = '2' then 1 else 0 end) as twoTotal,
sum(case when B = '3' then 1 else 0 end) as threeTotal
from test
group by A) as C;
Но в Spark SQL DataFrame сначала я вычисляю totalCount в каждом статусе, как показано ниже:
// wrong code
val cc = transDF.select("transData.*").groupBy("A")
.agg(count("transData.*").alias("total"),
sum(when(col("B") === "1", 1)).otherwise(0)).alias("oneTotal")
sum(when(col("B") === "2", 1).otherwise(0)).alias("twoTotal")
Проблема в том, что сумма (когда) результат равен нулю.
Я неправильно использую его? Как реализовать это в Spark SQL так же, как мой выше SQL? А потом подсчитать долю каждого статуса?
Спасибо за помощь. В конце концов, я решаю это с суммой (когда). ниже мой текущий код.
val cc = transDF.select("transData.*").groupBy("A")
.agg(count("transData.*").alias("total"),
sum(when(col("B") === "1", 1).otherwise(0)).alias("oneTotal"),
sum(when(col("B") === "2", 1).otherwise(0)).alias("twoTotal"))
.select(col("total"),
col("A"),
col("oneTotal") / col("total").alias("oneRate"),
col("twoTotal") / col("total").alias("twoRate"))
Еще раз спасибо.