2016-11-08 4 views
1

umgewandelt werden Ich versuche derzeit, LDA auf einem Funkencluster durchzuführen. Ich habe eine RDD, so dassPyspark mllib LDA Fehler: Objekt kann nicht in java.util.List

>>> 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])] 

aber

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

gibt die folgenden Fehler von einem Arbeiter Aufruf:

org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 5874.0 failed 4 times, most recent failure: Lost task 0.3 in stage 5874.0): java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to java.util.List

Ich weiß nicht, wie man diese Fehler zu interpretieren, abgesehen von den offensichtlichen , so würde jeder Rat geschätzt werden; die Dokumentation über LDA mllib das ist eher spärlich

ich die RDD aus dem folgenden Verfahren erhalten, mit einem Datenrahmen document_instances beginnen, die Spalten „doc_label“ und „Begriffe“

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

Mit dieser direkt den gleichen Fehler hat gibt . Nun verwendet dies HashingTF in pyspark.ml.feature, so vermutete ich, dass ein Konflikt durch den Unterschied zwischen Vector in mllib vs Vector in ml verursacht werden kann, aber Mapping direkt mit der Vector.fromML() -Funktion gibt den gleichen Fehler, wie es tut mit

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)) 

Antwort

1

So stellt sich heraus, dass der Funke Dokumentation etwas irreführend war, als sie sagt: „RDD von Dokumenten, die Tupeln von Dokumenten-IDs und Begriff (Wort) Zähler Vektoren sind.“ Vielleicht mißverstanden ich, aber wenn das Tupel zu einer Liste zu ändern, scheint dieser Fehler zu verschwinden (obwohl es durch einen anderen Fehler ersetzt worden zu sein scheint)

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

zu

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

Wird angezeigt, um das gestellte Problem nach dem Vergleich mit dem Beispielcode zu beheben

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

Verwandte Themen