news 2026/6/14 2:18:10

Flink ML VectorAssembler 把多列特征“拼”成一个向量列(数值 + 向量都支持)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Flink ML VectorAssembler 把多列特征“拼”成一个向量列(数值 + 向量都支持)

1. VectorAssembler 做什么?

给定一组输入列inputCols(每列类型必须是数值Vector),把它们按顺序组合成一个新向量列outputCol

  • 输入可以混合:

    • 单个数值列(Number)
    • DenseVector / SparseVector(Vector)
  • 输出是一个 Vector(通常是稠密或稀疏表示,取决于内部实现与输入组合)

典型用途:

  • StringIndexer -> OneHotEncoder -> VectorAssembler -> LogisticRegression
  • 数值特征 + one-hot 稀疏特征 + embedding 向量 -> VectorAssembler -> 模型

2. 输入列与输出列

输入列(Input Columns)

参数名类型默认值说明
inputColsNumber / Vectornull待拼接的列(可多列)

输出列(Output Columns)

参数名类型默认值说明
outputColVector"output"拼接后的向量列

3. 参数详解(Parameters)

Key默认值必填说明
inputColsnull输入列名数组(顺序很重要)
outputCol"output"输出列名
handleInvalidERROR_INVALID遇到非法值如何处理(如空值/类型不对等)

工程建议:

  • inputCols的顺序决定最终向量的维度排列,一旦上线最好固定,否则训练/预测会对不上。

4. Java 示例逐段解读

示例里把三列拼成一列:

  • vec:DenseVector(2.1, 3.1)(长度 2)
  • num:数值 1.0(长度 1)
  • sparseVec:SparseVector(size=5, …)(长度 5)

最终拼出来的向量长度应该是:2 + 1 + 5 = 8

4.1 输入数据

DataStream<Row>inputStream=env.fromElements(Row.of(Vectors.dense(2.1,3.1),1.0,Vectors.sparse(5,newint[]{3},newdouble[]{1.0})),Row.of(Vectors.dense(2.1,3.1),1.0,Vectors.sparse(5,newint[]{4,2,3,1},newdouble[]{4.0,2.0,3.0,1.0})));TableinputTable=tEnv.fromDataStream(inputStream).as("vec","num","sparseVec");

这里sparseVec的 size=5,意味着它代表长度为 5 的向量,只不过用稀疏方式存储非零位置。

4.2 创建 VectorAssembler

VectorAssemblervectorAssembler=newVectorAssembler().setInputCols("vec","num","sparseVec").setOutputCol("assembledVec");

拼接顺序就是:vec在前,num在中间,sparseVec在最后。
最终向量的 layout 可以理解为:

assembledVec = [ vec(2 dims) | num(1 dim) | sparseVec(5 dims) ]

4.3 transform 并读取输出

TableoutputTable=vectorAssembler.transform(inputTable)[0];VectoroutputValue=(Vector)row.getField(vectorAssembler.getOutputCol());System.out.printf("... Output Value: %s\n",outputValue);

输出 Value 会是一个 Vector(可能打印成 dense 或 sparse),内容会把三列的信息组合到同一个向量里。

5. 实战注意点(很关键)

1)OneHotEncoder 输出通常是 SparseVector,Assembler 非常适配

这也是最常见链路:

  • StringIndexer:city -> cityIndex
  • OneHotEncoder:cityIndex -> cityVec (SparseVector)
  • VectorAssembler:[数值列, cityVec, 其它Vec] -> features
  • LogisticRegression:features -> prediction

2)数值列不要忘记类型一致性

你的示例里num是 Double(1.0)。实际表里可能是 INT/LONG/FLOAT,建议统一成 Double 或确保能被识别为 Number。

3)维度稳定性是上线生命线

如果你在训练时inputCols=["age","cityVec","deviceVec"],上线推理千万不要换成["cityVec","age","deviceVec"],否则模型输入维度语义全错。

4)handleInvalid 的选择

  • 离线训练:可以ERROR_INVALID让问题暴露
  • 线上:更倾向“先做清洗”,或者用能跳过/替代的策略(如果支持),避免任务被脏数据打挂

6. 小结

VectorAssembler 是 Flink ML 里把“多列特征形态”统一成features向量列的关键组件:

  • 支持 Number + Vector 混合拼接
  • inputCols顺序决定最终向量维度布局
  • 常用于把 one-hot、embedding、数值特征拼成一个 features 列喂给模型
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/3 19:10:47

HarmonyOS 文件权限管理实战详解(含可运行 Demo)

网罗开发&#xff08;小红书、快手、视频号同名&#xff09;大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等方…

作者头像 李华
网站建设 2026/6/10 3:57:43

Mac用户也能用PyTorch-CUDA镜像?通过虚拟机实现方案

Mac用户也能用PyTorch-CUDA镜像&#xff1f;通过虚拟机实现方案 在深度学习项目中&#xff0c;你是否曾遇到这样的窘境&#xff1a;手握一台性能强劲的MacBook Pro&#xff0c;却因为无法使用CUDA加速而只能眼睁睁看着训练时间从几分钟拖到几小时&#xff1f;更别提那些依赖NV…

作者头像 李华
网站建设 2026/6/9 22:01:45

使用 Go 语言进行 LangChain 与 LangGraph 的实战案例研究报告

摘要 本文基于 Go 语言生态,系统研究了 LangChain 与 LangGraph 框架的实战应用。通过对比分析两种框架在 Go 环境下的实现差异,结合文档分析、多智能体协作等典型场景,深入探讨了 Go 语言在 AI 应用开发中的技术优势与实践挑战。报告提供了完整的代码实现方案,为开发者提…

作者头像 李华
网站建设 2026/6/5 12:46:37

风光储并网直流微电网Simulink仿真模型探索

储能控制器&#xff0c;风光储、风光储并网直流微电网simulink仿真模型。 系统有光伏发电系统、风力发电系统、储能系统、负载、逆变器?lcl?大电网构成。 附参考文献。 同时可附逆变器控制参数&#xff0c;lcl参数计算m文件&#xff08;另议&#xff09;。光伏系统采用扰动观…

作者头像 李华
网站建设 2026/6/9 21:19:49

PyTorch镜像适合做自然语言处理吗?NLP案例演示

PyTorch镜像在自然语言处理中的实战价值&#xff1a;从环境配置到模型部署的全链路解析 在当前深度学习工程实践中&#xff0c;一个常见的困境是&#xff1a;算法团队花费数天时间才把环境搭好&#xff0c;结果发现“代码跑通了&#xff0c;但GPU没用上”。尤其在自然语言处理…

作者头像 李华
网站建设 2026/6/3 20:11:42

图解说明温度传感器信号输出方式(模拟/I2C/单总线)

三种温度传感器输出方式怎么选&#xff1f;模拟、I2C、单总线实战全解析你有没有遇到过这样的问题&#xff1a;在做一个温控系统时&#xff0c;面对琳琅满目的温度传感器&#xff0c;不知道该选哪一种&#xff1f;是用最便宜的LM35直接接ADC&#xff0c;还是上DS18B20搞分布式测…

作者头像 李华