不带UDF的Spark中DataFrame的两个Vector列之间的点积

时间:2018-12-21 22:13:59

标签: apache-spark databricks

让我们考虑一个具有2列的Spark DataFrame,其中每列都是Vector类型。 有没有一种方法不涉及UDF来计算它们之间的点积?

我正在使用Spark 2.4(在DataBricks上,如果有涉及其高阶函数的解决方案)

1 个答案:

答案 0 :(得分:2)

没有任何合理的*方法可以执行以下操作,因为Vector不是本机类型。相反,它们实现了UserDefinedTypes and as such can be processed only indirectly

如果数据狭窄,则可以考虑转换为匹配的强类型Dataset,但不太可能带来任何重大改进(如果不降低性能)。


*一个人可以得出高度间接的解决方案,例如:

  • 添加唯一ID
  • 将向量转储到JSON。
  • 通过重新序列化为内部StructType表示来读取JSON。
  • 具有pos_explodeDenseVector)或爆炸索引和值(SparseVector)的爆炸向量
  • 通过唯一性和索引进行自我连接。
  • 聚合。

任何这样的事情都是昂贵的,而且完全不切实际的。