按矢量元素对数据帧排序

时间:2016-04-14 08:25:04

标签: scala sorting apache-spark apache-spark-sql

我使用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;

我似乎没有找到如何在我的sort函数中指定向量的第二个元素。

有什么想法吗?

由于

更新此数据框最多可能需要300万行,因此我不知道创建一个带有id的新数据帧是否有效,而且只有向量的第二个元素才能生成排序

1 个答案:

答案 0 :(得分:2)

您不能直接执行此操作,但可以使用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)))