2017-11-27 7 views
0

Ich habe einen Spark-Datensatz der folgenden Art:Wie wird Encoder beim Zuordnen eines Spark-Datasets von einem Typ zum anderen angegeben?

org.apache.spark.sql.Dataset[Array[Double]] 

Ich mag das Array zu einem Vektor zur Karte so, dass ich es als Eingabedatei für ml.clustering.KMeans.fit verwenden kann (...). Also versuche ich, so etwas zu tun:

val featureVectors = vectors.map(r => Vectors.dense(r)) 

Aber das schlägt mit dem folgenden Fehler:

error: Unable to find encoder for type stored in a Dataset. Primitive types (Int, String, etc) and Product types (case classes) are supported by importing spark.implicits._ Support for serializing other types will be added in future releases. 

Ich denke, ich brauche einen Encoder für die Karte Operation angeben, aber ich kämpfe mit einem zu finden, Weg, es zu tun. Irgendwelche Ideen?

Antwort

1

Sie müssen die Geber als implizite Beweise zur Verfügung stehen:

def map[U : Encoder](func: T => U): Dataset[U] 

bricht an:

def map[U](func: T => U)(implicit evidence$1: Encoder[U]): Dataset[U] 

So müssen Sie es weitergeben oder implizit zur Verfügung haben.

Das heißt, ich glaube nicht, dass Vector noch unterstützt wird, so dass Sie möglicherweise zu einem DataFrame fallen müssen.

+0

Ja, ich bin so weit von der Dokumentation entfernt. Aber ich habe nicht verstanden, wie man es in der Praxis macht. Wenn Vector nicht unterstützt wird, wie wird es dann als Eingabe für die Implementierung von ml.clustering.kmeans dokumentiert? https://spark.apache.org/docs/2.2.0/ml-clustering.html –

Verwandte Themen