1. Flink ML 的数据类型支持范围
Flink ML 支持:
-
Flink Table API 支持的全部类型
例如:
BOOLEAN / INT / BIGINT / DOUBLE / STRING / ARRAY / MAP / ROW / TIMESTAMP等。 -
Flink ML 在此基础上补充的类型
最典型就是 Vector(向量),用于表示模型输入的特征。
2. Vector 是什么?
在 Flink ML 中,Vector 表示一个 double 数组形式的向量,并且有两个具体实现:
-
DenseVector(稠密向量)
- 大部分维度都有值(或你希望用数组直接存储所有维度)
- 适合维度不算特别高、或者特征不是很稀疏的场景
-
SparseVector(稀疏向量)
- 只有少量维度有非零值
- 适合高维稀疏特征(比如 one-hot、词袋、特征哈希等)
无论 Dense 还是 Sparse,Flink ML 的 Vector 都具备这些共同特点:
- 向量在创建时就固定 size(维度)
- 支持按 0-based 下标读取 / 设置某一维的 double 值
- 都用于表达"特征列",常见列名是
features
3. Vectors 工具类:创建向量更方便
Flink ML 提供了 Vectors 工具类,用来快速构造 DenseVector / SparseVector。
4. Java 示例:构造 SparseVector
你给的示例含义是:
- 向量维度
n = 4(即下标范围 0~3) - 只有下标
0,2,3是非零维度 - 对应值分别是
0.1, 0.3, 0.4
java
int n = 4;
int[] indices = new int[] {0, 2, 3};
double[] values = new double[] {0.1, 0.3, 0.4};
SparseVector vector = Vectors.sparse(n, indices, values);
这等价于一个完整的 dense 表达:
text
[0.1, 0.0, 0.3, 0.4]
5. 你在工程里什么时候用 Dense / Sparse?
用 DenseVector 的典型情况
- 特征维度较小(比如几十维、几百维)
- 大多数维度都有值(不稀疏)
- 特征已经是数值型统计特征(pv/click/avg_duration 等)
用 SparseVector 的典型情况
-
特征维度很高(几千、几万甚至更高)
-
绝大多数维度都是 0(稀疏)
-
常见于:
- one-hot 编码后的离散特征
- 文本特征(词袋/TF-IDF)
- 特征哈希
6. 实用小提示:SparseVector 的注意事项
在构造稀疏向量时,建议保证:
indices.length == values.length- indices 取值范围必须在
[0, n-1] - indices 最好是严格递增且不重复(很多实现会假设这一点,或性能更好)