如何在数据框中的2列之间执行dotProduct

时间:2017-10-01 19:04:24

标签: apache-spark spark-dataframe

我正在使用Spark 2.2。我有DataFrameArrayType个固定大小的列。

我想在这些列之间执行点积。

我正在使用 udf ,但我想知道是否有更好的方式?

val dotProduct = udf((l1: Seq[Double], l2: Seq[Double]) => l1.zip(l2).map(t => t._1 * t._2).sum)

2 个答案:

答案 0 :(得分:0)

UDF在这里和所有其他问题中都是一个很好的解决方案:

对于固定大小的数组,您可以按索引访问元素,但除此之外别无选择。

答案 1 :(得分:0)

我已经尝试了其他两种策略:

不使用UDF

val dotProduct =
  (0 until nb)
    .map(i => $"c1"(i) * $"c2"(i))
    .reduce(_ + _)

速度慢了。

使用UDF,但避免创建中间集合。

val dotProoduct = udf((l1: Seq[Double], l2: Seq[Double]) => {
  var b = 0.0
  val these = l1.iterator
  val those = l2.iterator
  while (these.hasNext && those.hasNext)
    b += these.next() * those.next()
  b
})

我的性能提升了2 \ o /