2017-10-26 2 views
0

Ich habe eine RDD von labeled point in Spark. Ich möchte alle eindeutigen Werte von Labels zählen. Ich versuche, etwasPyspark Anzahl deutliche Werte von Etiketten eines markierten Punkt RDD

from pyspark.mllib.regression import LabeledPoint 

train_data = sc.parallelize([ LabeledPoint(1.0, [1.0, 0.0, 3.0]),LabeledPoint(2.0, [1.0, 0.0, 3.0]),LabeledPoint(1.0, [1.0, 0.0, 3.0]) ]) 

train_data.reduceByKey(lambda x : x.label).collect() 

Aber ich bekomme

TypeError: 'LabeledPoint' object is not iterable

Ich benutze Spark-2.1 ​​und Python 2.7. Danke für jede Hilfe.

+0

Bitte geben Sie eine Probe Ihrer Daten – desertnaut

+0

@desertnaut ich mit einigen Daten meiner Frage aktualisieren –

Antwort

2

Sie müssen nur Ihre LabeledPoint zu einem Schlüssel-Wert RDD konvertieren und dann mit Schlüsseln zählen:

spark.version 
# u'2.1.1' 

from pyspark.mllib.regression import LabeledPoint 

train_data = sc.parallelize([ LabeledPoint(1.0, [1.0, 0.0, 3.0]),LabeledPoint(2.0, [1.0, 0.0, 3.0]),LabeledPoint(1.0, [1.0, 0.0, 3.0]) ]) 

dd = train_data.map(lambda x: (x.label, x.features)).countByKey() 
dd 
# {1.0: 2, 2.0: 1}  
+0

Dies löst die OP-Pb. Aber es wäre nett, eine Erklärung zu haben :) – eliasah

+1

Hier gehts https://stackoverflow.com/questions/24804619/how-does-spark-aggregate-funktion-aggregatebykey-work und https://databricks.gitbooks.io /databricks-spark-knowledge-base/content/best_practices/prefer_reducebykey_over_groupbykey.html Sie können diese Links als extra lesen :) – eliasah

+0

@eliasah zu viele Aufgaben, zu wenig Zeit ... :( – desertnaut