Apache spark spark可以高效地查找一组列的最频繁值

Apache spark spark可以高效地查找一组列的最频繁值,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,我想知道spark中是否有比使用rank()更有效的方法来查找一组列中最频繁的值,以便将其用作缺失值的插补 例如,在spark sql中,我可以用类似的公式 每列。 此解决方案适用于使用秩的单个列。我想要的是a)一个更有效的变体(如第一个答案所概述的)和b)比使用for循环和a)的解决方案应用于多个列更为优化的东西 你认为有没有可能在spark中对此进行优化 编辑 举个例子。这是一个小数据集 case class FooBarGG(foo: Int, bar: String, baz: Stri

我想知道spark中是否有比使用
rank()
更有效的方法来查找一组列中最频繁的值,以便将其用作缺失值的插补

例如,在spark sql中,我可以用类似的公式 每列。 此解决方案适用于使用秩的单个列。我想要的是a)一个更有效的变体(如第一个答案所概述的)和b)比使用for循环和a)的解决方案应用于多个列更为优化的东西

你认为有没有可能在spark中对此进行优化

编辑 举个例子。这是一个小数据集

case class FooBarGG(foo: Int, bar: String, baz: String, dropme: String)
val df = Seq((0, "first", "A", "dropme"), (1, "second", "A", "dropme2"),
    (0, "first", "B", "foo"),
    (1, "first", "C", "foo"))
    .toDF("foo", "bar", "baz", "dropme").as[FooBarGG]
val columnsFactor = Seq("bar", "baz")
val columnsToDrop = Seq("dropme")
val factorCol= (columnsFactor ++ columnsToDrop).map(c => col(c))
用答案中的疑问

df.groupBy(factorCol: _*).count.agg(max(struct($"count" +: factorCol: _*)).alias("mostFrequent")).show
+--------------------+
|        mostFrequent|
+--------------------+
|[1,second,A,dropme2]|
+--------------------+
|-- mostFrequent: struct (nullable = true)
 |    |-- count: long (nullable = false)
 |    |-- bar: string (nullable = true)
 |    |-- baz: string (nullable = true)
 |    |-- dropme: string (nullable = true)

是结果,但对于列bar->first,baz->A和drompe->foo是最常见的单个top1值,这与返回的结果不同。

只要字段可以排序,并且count是前导值,就可以使用简单聚合:

import org.apache.spark.sql.functions_
val df=序号(“约翰”、“简”、“伊芙”、“乔”、“伊芙”)。toDF(“姓名”)
val分组=序号($“名称”)
df.groupBy(grouping:*).count.agg(max(struct($“count”+:grouping:*))
也可以使用静态类型的
数据集

import org.apache.spark.sql.catalyst.encoders.RowEncoder
groupByKey(x=>x)(行编码器(df.schema)).count.reduce(
(x,y)=>如果(x.2>y.2)x其他y
)
您可以调整分组列或键函数以处理更复杂的场景