我正在使用Spark 2.2。我有DataFrame
个ArrayType
个固定大小的列。
我想在这些列之间执行点积。
我正在使用 udf ,但我想知道是否有更好的方式?
val dotProduct = udf((l1: Seq[Double], l2: Seq[Double]) => l1.zip(l2).map(t => t._1 * t._2).sum)
答案 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 /