安装FlinkML DenseVector依赖:为何存在两种不同实现?
解决Flink DenseVector API缺失问题
原因说明
Flink ML在版本迭代中做了包结构重构:
- Flink 1.12及更早版本里,带完整数学操作的
DenseVector位于org.apache.flink.ml.common.linalg包下,属于Flink主项目的ML模块。 - Flink ML 2.x(如你使用的2.1.0)已成为独立项目,
DenseVector被移至org.apache.flink.ml.linalg包,且API做了精简,原有数学操作被拆分或调整。
两种解决方案
方案1:回退到Flink 1.12版本的ML依赖
如果必须使用旧版带完整数学操作的DenseVector,需要引入Flink 1.12对应的ML依赖,同时确保项目的Flink核心版本也为1.12.x,避免版本冲突:
<dependency> <groupId>org.apache.flink</groupId> <artifactId>flink-ml</artifactId> <version>1.12.7</version> <!-- 推荐用1.12系列最新小版本,稳定性更好 --> </dependency>
注意:此依赖属于Flink 1.12主发布的一部分,并非独立的Flink ML 2.x包。
方案2:在Flink ML 2.1中自行实现数学操作
如果不想回退版本,可以基于新版org.apache.flink.ml.linalg.DenseVector自行封装常用数学操作,比如点积的实现示例:
import org.apache.flink.ml.linalg.DenseVector; public class VectorMathUtils { // 实现点积计算 public static double dot(DenseVector vec1, DenseVector vec2) { if (vec1.size() != vec2.size()) { throw new IllegalArgumentException("两个向量维度必须一致"); } double sum = 0.0; for (int i = 0; i < vec1.size(); i++) { sum += vec1.get(i) * vec2.get(i); } return sum; } // 可扩展其他操作,比如向量加法 public static DenseVector add(DenseVector vec1, DenseVector vec2) { if (vec1.size() != vec2.size()) { throw new IllegalArgumentException("两个向量维度必须一致"); } double[] result = new double[vec1.size()]; for (int i = 0; i < vec1.size(); i++) { result[i] = vec1.get(i) + vec2.get(i); } return new DenseVector(result); } }
内容的提问来源于stack exchange,提问作者drsealks
相关产品推荐
相关产品推荐

