没有 UDF 的 Spark 中 DataFrame 的两个 Vector 列之间的点积
Dot product between two Vector columns of a DataFrame in Spark without UDF
让我们考虑一个包含 2 列的 Spark DataFrame,每列都是 Vector 类型。
有没有不涉及 UDF 的方法来计算它们之间的点积?
我正在使用 Spark 2.4(在 DataBricks 上,以防有涉及其高阶函数的解决方案)
没有任何合理的*方式来做这样的事情,因为向量不是本机类型。相反,他们实施 UserDefinedTypes
and as such can be processed only indirectly.
如果数据很窄,您可能会考虑转换为匹配强类型 Dataset
,但它不太可能带来任何重大改进(如果不降低性能的话)。
* 可以得出高度间接的解决方案,例如:
- 添加唯一 ID
- 将矢量转储到 JSON。
- 通过重新序列化为内部
StructType
表示来读取 JSON。
- 使用
pos_explode
(DenseVector
) 或压缩索引和值 (SparseVector
) 展开向量
- 通过唯一性和索引自连接。
- 汇总。
任何这样的东西都会很昂贵而且完全不切实际。
让我们考虑一个包含 2 列的 Spark DataFrame,每列都是 Vector 类型。 有没有不涉及 UDF 的方法来计算它们之间的点积?
我正在使用 Spark 2.4(在 DataBricks 上,以防有涉及其高阶函数的解决方案)
没有任何合理的*方式来做这样的事情,因为向量不是本机类型。相反,他们实施 UserDefinedTypes
and as such can be processed only indirectly.
如果数据很窄,您可能会考虑转换为匹配强类型 Dataset
,但它不太可能带来任何重大改进(如果不降低性能的话)。
* 可以得出高度间接的解决方案,例如:
- 添加唯一 ID
- 将矢量转储到 JSON。
- 通过重新序列化为内部
StructType
表示来读取 JSON。 - 使用
pos_explode
(DenseVector
) 或压缩索引和值 (SparseVector
) 展开向量 - 通过唯一性和索引自连接。
- 汇总。
任何这样的东西都会很昂贵而且完全不切实际。