我使用Apache Spark实现了此数据帧,如下所示:
id vector
1 [0.456,0.789]
2 [0.123,0.356]
...
我想通过该向量的第二个元素对该数据帧进行排序。我已经准备好了这样的东西:
val sortedDF = df.sort(desc("vector"))
当然,这会导致一个异常:
cannot resolve 'probability DESC' due to data type mismatch: cannot sort data type vector;
我似乎找不到如何在我的排序函数中指定向量的第二个元素。
有任何想法吗?
谢谢
更新此数据框最多可容纳300万行,因此我不知道创建具有ID并且仅对向量的第二个元素进行排序的新数据框是否有效。
你不能直接做,而是有可能使用UDF转换vector
到array
并提取要排序各个元素:
import org.apache.spark.mllib.linalg.{Vector, Vectors}
val to_array = udf((v: Vector) => v.toDense.values)
val df = Seq("[0.0, 1.0]", "[1.0, 0.0]").map(Vectors.parse(_))
.zipWithIndex
.toDF("vector", "idx")
df.orderBy(to_array($"vector"))
df.orderBy(to_array($"vector").getItem(1).desc)
如果vector很大,并且您打算仅访问单个元素,则直接进行操作会更有效:
val apply_vec = udf((v: Vector, i: Int) => Try(v(i)).toOption)
df.orderBy(apply_vec($"vector", lit(1)))
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句