首页 > 解决方案 > Spark CountVectorizer 返回 udt 而不是向量

问题描述

我尝试为 Spark 2.3.0 中的 LDA 分析创建令牌计数向量。我遵循了一些教程,每次他们使用 CountVectorizer 轻松地将字符串数组转换为向量。

我在我的 Databricks 笔记本上运行这个简短的示例:

import org.apache.spark.ml.feature.CountVectorizer

val testW = Seq(
  (8, Array("Zara", "Nuha", "Ayan", "markle")),
  (9, Array("fdas", "test", "Ayan", "markle")),
  (10, Array("qwertzu", "test", "Ayan", "fdaf"))
  ).toDF("id", "filtered")

// Set params for CountVectorizer
val vectorizer = new CountVectorizer()
  .setInputCol("filtered")
  .setOutputCol("features")
  .setVocabSize(5) 
  .setMinDF(2) 
  .fit(testW)

// Create vector of token counts
val articlesCountVector = vectorizer.transform(testW).select("id", "features")
display(articlesCountVector)

输出如下: 输出

但是在我读过的所有教程中,“特征”的类型是vector。为什么在我的情况下是udt

我忘了什么吗?为什么它不是向量?

是否可以转换它?因为我无法使用这种 udt 类型创建 LDA 模型。

标签: apache-sparkapache-spark-sqlapache-spark-mllib

解决方案


这里没有问题。您看到的是 Databricks 显示功能的实现细节。

在内部,两者o.a.s.ml.linalg.Vector和都没有在APIo.a.s.mllib.linalg.Vector中本地表示,并使用s ( )。因此输出。DatasetUDTUserDefinedTypes

您可以在理解 VectorAssembler 的输出 --- Spark中找到所有字段的确切含义


推荐阅读