按向量元素对数据框进行排序

鲁迪·弗博文

我使用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并且仅对向量的第二个元素进行排序的新数据框是否有效。

零323

你不能直接做,而是有可能使用UDF转换vectorarray并提取要排序各个元素:

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章