如何使用 Latent Dirichlet Allocation(从 spark.mllib 包迁移)?

How to use Latent Dirichlet Allocation (migrating from spark.mllib package)?

我正在使用 Apache Spark 2.1.2,我想使用 Latent Dirichlet allocation (LDA)

以前我使用的是 org.apache.spark.mllib 包,我可以 运行 这没有任何问题,但现在开始使用 spark.ml 我收到了一个错误。

val lda = new LDA().setK(numTopics).setMaxIter(numIterations)
val docs = spark.createDataset(documents)
val ldaModel = lda.fit(docs)

您可能已经注意到,我正在将 documents RDD 转换为数据集对象,但不确定这是否是正确的方法。

.fit 的最后一行中,我收到以下错误:

java.lang.IllegalArgumentException: Field "features" does not exist.

我的 docs 数据集如下所示:

scala> docs.take(2)
res28: Array[(Long, org.apache.spark.ml.linalg.Vector)] = Array((0,(7336,[1,2,4,5,12,13,19,24,26,42,48,49,57,59,63,73,81,89,99,106,113,114,141,151,157,160,177,181,198,261,266,267,272,297,307,314,315,359,383,385,410,416,422,468,471,527,564,629,717,744,763,837,890,928,932,951,961,1042,1134,1174,1305,1604,1653,1850,2119,2159,2418,2634,2836,3002,3132,3594,4103,4316,4852,5065,5107,5632,5945,6378,6597,6658],[1.0,1.0,1.0.......

我之前的 documents 在将它们转换为数据集之前:

documents: org.apache.spark.rdd.RDD[(Long, org.apache.spark.ml.linalg.Vector)] = MapPartitionsRDD[2520]

如何消除上述错误?

spark mllib 和 spark ml 之间的主要区别是 spark ml 对数据帧(或数据集)进行操作,而 mllib 直接对结构非常明确的 RDD 进行操作。

您不需要做很多事情就可以让您的代码与 spark ml 一起工作,但我仍然建议您浏览他们的文档页面并了解差异,因为您会遇到越来越多的差异越来越多地转向 spark ml。此处是包含所有基础知识的良好起始页 https://spark.apache.org/docs/2.1.0/ml-pipeline.html

但是对于您的代码,所需要的只是为每一列提供一个正确的列名,它应该可以正常工作。可能最简单的方法是在底层 RDD:

上使用隐式方法 toDF
import spark.implicits._

val lda = new LDA().setK(numTopics).setMaxIter(numIterations)
val docs = documents.toDF("label", "features")
val ldaModel = lda.fit(docs)