Trans

2016-08-01 21 views
3

ich einen Spark-Datenrahmen haben, die wie folgt aussieht:Trans

+-----------+-------------------+ 
|  ID |  features  | 
+-----------+-------------------+ 
| 18156431|(5,[0,1,4],[1,1,1])| 
| 20260831|(5,[0,4,5],[2,1,1])| 
| 91859831|(5,[0,1],[1,3]) | 
| 206186631|(5,[3,4,5],[1,5]) | 
| 223134831|(5,[2,3,5],[1,1,1])| 
+-----------+-------------------+ 

die Funktionen Spalte In diesem Datenrahmen ist ein spärlich Vektor. In meinen Skripten muss ich diesen DF als Datei auf der Festplatte speichern. Wenn Sie dies tun, wird die Feature-Spalte als Textspalte gespeichert: Beispiel "(5,[0,1,4],[1,1,1])". Wenn Sie erneut in Spark importieren, bleibt die Spalte wie erwartet erhalten. Wie kann ich die Spalte wieder in das (spärliche) Vektorformat konvertieren?

+0

Welche Version von Spark? Welche Vektorklasse möchten Sie erhalten ('ML' /' MLib')? Wie liest du diese Daten? – zero323

+0

Spark-Version = 1.6.2. Vorzugsweise ein ML-Vektor (aber Sie können für beide erklären). Ich verwende den folgenden Code zum Lesen der Daten: 'DF = sqlContext.read.format ('com.databricks.spark.csv'). Options (header = 'true', inferschema = 'true', delimiter = Begrenzer) .load ('file: //' + path) .drop ('') ' – Stijn

+0

Es gibt keinen ML Vektor in 1.6, damit es einfacher wird :) – zero323

Antwort

3

nicht besonders effizient (es wäre eine gute Idee, ein Format zu verwenden, die Arten bewahrt) aufgrund UDF-Overhead, aber Sie können so etwas tun:

from pyspark.mllib.linalg import Vectors, VectorUDT 
from pyspark.sql.functions import udf 

df = sc.parallelize([ 
    (18156431, "(5,[0,1,4],[1,1,1])") 
]).toDF(["id", "features"]) 

parse = udf(lambda s: Vectors.parse(s), VectorUDT()) 
df.select(parse("features")) 

Bitte beachten Sie diesen Anschluss nicht direkt an 2.0.0+ und MLVector. Da ML-Vektoren keine parse Methode zur Verfügung stellen, müssten Sie MLLib analysieren und asML verwenden.

+0

Es hat funktioniert! Danke! – Stijn

+0

Könnten Sie mir bitte einen Beispielcode von asML in Python und Spark 2.0.2 zur Verfügung stellen? Sollte ich das asML in ein udf schreiben? – Stijn