在聚合数据框中查找平方和分数
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
我想要 groupBy
列 A
和 B
,并且对于每个分区,我想要找到 unique C 的值。例如,当按 A
和 B
分组时,对于值 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
假设我有一个简化的 DataFrame,如下所示:
A B C
-------
9 6 8
9 6 8
9 6 7
7 4 2
8 3 2
我想要 groupBy
列 A
和 B
,并且对于每个分区,我想要找到 unique C 的值。例如,当按 A
和 B
分组时,对于值 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