Pyspark mllib LDA错误:无法将对象强制转换为java.util.List

时间:2016-11-08 23:31:33

标签: apache-spark pyspark apache-spark-mllib

我目前正在尝试在火花群上执行LDA。我有一个RDD,

>>> myRdd.take(2)
[(218603, [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0]), (95680, [0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0])]

但是打电话

model = LDA.train(myRdd, k=5, seed=42)

从工人那里得到以下错误:

  

org.apache.spark.SparkException:作业因阶段失败而中止:阶段5874.0中的任务0失败4次,最近失败:阶段5874.0中失去任务0.3):java.lang.ClassCastException:[Ljava.lang。宾语;无法转换为java.util.List

我不知道除了显而易见之外如何解释这个错误,所以任何建议都会受到赞赏;关于mllib的LDA的文档相当稀疏

我从以下过程中获取RDD,从包含“doc_label”和“terms”列的数据框document_instances开始

hashingTF = HashingTF(inputCol="terms", outputCol="term_frequencies", numFeatures=10)
tf_matrix = hashingTF.transform(document_instances)
myRdd = tf_matrix.select("doc_label", "term_frequencies").rdd

直接使用它会产生相同的错误。现在,这是在pyspark.ml.feature中使用 HashingTF ,所以我怀疑可能存在因mllib与Vector之间的差异而导致的冲突,以ml为单位,但直接使用Vector.fromML进行映射( )函数给出了与使用

相同的错误
myRdd = tf_matrix.select(...).rdd.map(lambda old_row: \
                                    (old_row.term, old_row.term_frequencies.toArray().tolist()))
myRdd = tf_matrix.select(...).rdd.map(lambda old_row: \
                                    (old_row.term, old_row.term_frequencies.toArray()))
myRdd = tf_matrix.select(...).rdd.map(lambda old_row: \
                                    (old_row.term, Vectors.fromML(old_row.term_frequencies)))
myRdd = tf_matrix.select(...).rdd.map(lambda old_row: \
                                    (old_row.term, old_row.term_frequencies))

1 个答案:

答案 0 :(得分:1)

因此,事实证明,如果文档的RDD文件是文档ID和术语(字)计数向量的元组,那么Spark文档就会有点误导。&# 34;也许我误解了,但是当将元组更改为列表时,这个错误似乎消失了(虽然它似乎已经被不同的错误所取代)

更改

myRdd = tf_matrix.select(...).rdd.map(lambda old_row: \
                                    (old_row.term, old_row.term_frequencies))

myRdd = tf_matrix.select(...).rdd.map(lambda old_row: \
                                    [old_row.term, Vectors.fromML(old_row.term_frequencies)])

在与其示例代码

进行比较后,似乎可以缓解问题

http://spark.apache.org/docs/latest/api/python/pyspark.mllib.html#pyspark.mllib.clustering.LDA