Scala 如何使用ApacheSpark生成固定长度的二进制表示?

Scala 如何使用ApacheSpark生成固定长度的二进制表示?,scala,apache-spark,Scala,Apache Spark,使用下面的代码,我试图将字符串转换为二进制表示: import org.apache.spark.ml.feature.{HashingTF, IDF, Tokenizer} val sentenceData = spark.createDataFrame(Seq( (0.0, "Hi I heard about Spark"), (0.0, "I wish Java could use case classes"), (1.0, "Logistic regression mode

使用下面的代码,我试图将字符串转换为二进制表示:

import org.apache.spark.ml.feature.{HashingTF, IDF, Tokenizer}

val sentenceData = spark.createDataFrame(Seq(
  (0.0, "Hi I heard about Spark"),
  (0.0, "I wish Java could use case classes"),
  (1.0, "Logistic regression models are neat")
)).toDF("label", "sentence")

val tokenizer = new Tokenizer().setInputCol("sentence").setOutputCol("words")
val wordsData = tokenizer.transform(sentenceData)

val hashingTF = new HashingTF().setBinary(true).setInputCol("words").setOutputCol("rawFeatures").setNumFeatures(5)

val featurizedData = hashingTF.transform(wordsData)

val idf = new IDF().setInputCol("rawFeatures").setOutputCol("features")
val idfModel = idf.fit(featurizedData)

val rescaledData = idfModel.transform(featurizedData)

rescaledData.rdd.collect()
这将返回:

以上代码基于

但是二进制表示的长度不同

特征和特征之间有什么区别

如何生成固定长度的二进制表示

更新:

所以
(8[0,1,5],[1.0,1.0,1.0])
表示
[1.0,1.0,0.0,0.0,0.0,1.0,0.0,0.0,0.0]
是否存在提取
[1.0,1.0,0.0,0.0,0.0]表示的API方法?
正在读取API文档,该文档似乎不可用

但是二进制表示的长度不同

没有。这些都是尺寸为5的
sparsevector
。表示中的第一个数字是
向量的大小,两个数组表示非零项的标记和值

特征和特征之间有什么区别

HashingTF
使用和输出向量或多或少地表示每个令牌的计数

IDF
计算

如何生成固定长度的二进制表示

同上

编辑

可以转换为密集表示,例如使用
udf

import org.apache.spark.ml.linalg.Vector

val toDense = udf((v: Vector) => v.toDense)
但是几乎从来都不想要。在正常情况下,
HashingTF
使用非常多的特征(默认情况下,2^20,较高的值并不少见)来避免散列冲突,但单个
向量
非常稀疏。因此,这种表示非常有效。转换为稠密可以在没有任何信息增益的情况下,将内存消耗增加几个数量级