【问题标题】:How to use Latent Dirichlet Allocation (migrating from spark.mllib package)?如何使用潜在狄利克雷分配(从 spark.mllib 包迁移)?
【发布时间】:2019-12-06 23:51:51
【问题描述】:

我正在使用 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:字段“features”不存在。

我的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]

如何摆脱上面的错误?

【问题讨论】:

    标签: scala apache-spark apache-spark-mllib


    【解决方案1】:

    spark mllib 和 spark ml 的主要区别在于,spark ml 在数据帧(或数据集)上运行,而 mllib 直接在结构非常明确的 RDD 上运行。

    您不需要做太多事情就可以使您的代码与 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-08
      • 2015-10-07
      • 2020-07-21
      • 2017-08-12
      • 2017-04-01
      • 1970-01-01
      • 2014-09-24
      • 2016-09-10
      相关资源
      最近更新 更多