理解Spark SQL中向量列的表示

use*_*546 3 apache-spark apache-spark-sql apache-spark-ml apache-spark-mllib

在我使用VectorAssembler()来合并一些OneHotEncoded分类功能之前...我的数据框看起来像这样:

|  Numerical|  HotEncoded1|   HotEncoded2
|  14460.0|    (44,[5],[1.0])|     (3,[0],[1.0])|
|  14460.0|    (44,[9],[1.0])|     (3,[0],[1.0])|
|  15181.0|    (44,[1],[1.0])|     (3,[0],[1.0])|
Run Code Online (Sandbox Code Playgroud)

第一列是数字列,另外两列表示OneHotEncoded分类特征的转换数据集.应用VectorAssembler()后,我的输出变为:

[(48,[0,1,9],[14460.0,1.0,1.0])]
[(48,[0,3,25],[12827.0,1.0,1.0])]
[(48,[0,1,18],[12828.0,1.0,1.0])]
Run Code Online (Sandbox Code Playgroud)

我不确定这些数字是什么意思,也无法理解这个转换后的数据集.关于这个输出意味着什么的一些澄清会很棒!

zer*_*323 9

此输出不是特定于VectorAssembler.它只是o.a.s.ml.linalg.SparseVector(o.a.s.mllib.linalg.SparseVector在Spark <2.0中)的字符串表示形式:

  • 表示向量长度的前导数字
  • 括号中的第一组数字是非零指数列表
  • 括号中的第二组数字是与索引相对应的值列表

所以(48,[0,1,9],[14460.0,1.0,1.0])代表一个长度为48的向量,有三个非零项:

  • 14460.0在第0位
  • 在第1位置1.0
  • 1.0在第9位

几乎相同的描述也适用于HotEncoded1HotEncoded2Numerical仅仅是一个标量.在没有看到元数据和构造函数的情况下,不可能分辨很多,但编码变量应该具有44和3或45和4级别(取决于dropLast参数).