在聚合数据框中查找平方和分数

Finding sum-of-square fractions in an aggregated dataframe

假设我有一个简化的 DataFrame,如下所示:

A  B  C
-------
9  6  8 
9  6  8
9  6  7
7  4  2
8  3  2

我想要 groupByAB,并且对于每个分区,我想要找到 unique C 的值。例如,当按 AB 分组时,对于值 9 和 6,我的值分别为 (2/3)^2 + (1/3 )^2。 3 变成分区中有 3 个值,2 来自 8 的数量,1 来自 7 的数量。这应该对每个由 groupBy 方法创建的分区完成。

一种可能的方法是这样的:

import org.apache.spark.sql.expressions.Window
import org.apache.spark.sql.functions.{pow, sum}

val w = Window.partitionBy("A", "B")

val tmp = pow(
  $"count" /             // numerator (see below)
  sum($"count").over(w), // denominator
2)

df
  .groupBy($"A", $"B", $"C").count  // Find numerators 
  .withColumn("_tmp", tmp) // Compute fractions
  .groupBy($"A", $"B").agg(sum($"_tmp").as("ssq")) // Compute totals