Python 3.x 如何在pyspark中将sparsevector传递给'mllib'

Python 3.x 如何在pyspark中将sparsevector传递给'mllib',python-3.x,pyspark,sparse-matrix,apache-spark-mllib,Python 3.x,Pyspark,Sparse Matrix,Apache Spark Mllib,我通过齐柏林飞艇和python 3.5使用pyspark 1.6.3 我正在尝试使用pysparkcountvectorier和LDA函数实现潜在的Dirichlet分配。首先,问题是:这是我正在使用的代码。让df成为一个spark数据帧,在“标记化”列中包含标记化文本 vectors = 'vectors' cv = CountVectorizer(inputCol = 'tokenized', outputCol = vectors) model = cv.fit(df) df = mode

我通过齐柏林飞艇和python 3.5使用pyspark 1.6.3

我正在尝试使用pyspark
countvectorier
LDA
函数实现潜在的Dirichlet分配。首先,问题是:这是我正在使用的代码。让
df
成为一个spark数据帧,在“标记化”列中包含标记化文本

vectors = 'vectors'
cv = CountVectorizer(inputCol = 'tokenized', outputCol = vectors)
model = cv.fit(df)
df = model.transform(df)

corpus = df.select(vectors).rdd.zipWithIndex().map(lambda x: [x[1], x[0]]).cache()
ldaModel = LDA.train(corpus, k=25)
此代码或多或少取自。 在调用
LDA
时,我得到以下错误:

net.razorvine.pickle.PickleException: expected zero arguments for construction of ClassDict (for pyspark.sql.types._create_row)
报告告诉我这是由于类型不匹配造成的

让我们看看
LDA
CountVectorizer
的类型。从spark docs这里可以看到另一个稀疏向量进入
LDA

>>> from pyspark.mllib.linalg import Vectors, SparseVector
>>> data = [
...     [1, Vectors.dense([0.0, 1.0])],
...     [2, SparseVector(2, {0: 1.0})],
... ]
>>> rdd =  sc.parallelize(data)
>>> model = LDA.train(rdd, k=2, seed=1)
我自己实现了这一点,这就是
rdd
的样子:

>> testrdd.take(2)

[[1, DenseVector([0.0, 1.0])], [2, SparseVector(2, {0: 1.0})]]
另一方面,如果我转到我的原始代码,查看带有
CountVectorizer
输出的
语料库
rdd,我会看到(编辑以删除无关位):

因此,我使用的示例(来自文档!)不会生成(index,SparseVector)的元组,而是(index,Row(SparseVector))。。。还是什么

问题:

  • SparseVector周围的行包装器是导致此错误的原因吗
  • 如果是这样,我如何摆脱Row对象?行是df的一个属性,但我使用
    df.rdd
    转换为rdd;我还需要做什么

    • 这可能是问题所在。只需从
      对象中提取
      向量

      corpus = df.select(vectors).rdd.zipWithIndex().map(lambda x: [x[1], x[0]['vectors']]).cache()
      
      corpus = df.select(vectors).rdd.zipWithIndex().map(lambda x: [x[1], x[0]['vectors']]).cache()