Apache spark 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
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
)
您可以调整分组列或键函数以处理更复杂的场景