6

Ich habe einen Datenrahmen df mit einer VectorUDT Spalte namens features. Wie bekomme ich ein Element der Spalte, sagen wir erstes Element?Zugriff auf Element einer VectorUDT-Spalte in einem Spark DataFrame?

Ich habe versucht, Sie folgendermaßen vorgehen

from pyspark.sql.functions import udf 
first_elem_udf = udf(lambda row: row.values[0]) 
df.select(first_elem_udf(df.features)).show() 

aber ich bekomme einen net.razorvine.pickle.PickleException: expected zero arguments for construction of ClassDict(for numpy.dtype) Fehler. Derselbe Fehler, wenn ich stattdessen first_elem_udf = first_elem_udf(lambda row: row.toArray()[0]) mache.

Ich versuchte auch explode(), aber ich bekomme einen Fehler, weil es ein Array oder einen Kartentyp erfordert.

Dies sollte eine gemeinsame Operation sein, denke ich.

Antwort

5

Convert Ausgabe float:

from pyspark.sql.types import DoubleType 
from pyspark.sql.functions import lit, udf 

def ith_(v, i): 
    try: 
     return float(v[i]) 
    except ValueError: 
     return None 

ith = udf(ith_, DoubleType()) 

Beispiel Nutzung:

from pyspark.ml.linalg import Vectors 

df = sc.parallelize([ 
    (1, Vectors.dense([1, 2, 3])), 
    (2, Vectors.sparse(3, [1], [9])) 
]).toDF(["id", "features"]) 

df.select(ith("features", lit(1))).show() 

## +-----------------+ 
## |ith_(features, 1)| 
## +-----------------+ 
## |    2.0| 
## |    9.0| 
## +-----------------+ 

Erläuterung:

Ausgangswerte haben serialisierten gleichwertigen Java-Objekte werden. Wenn Sie values zugreifen möchten (Vorsicht SparseVectors) Sie item Methode verwenden sollten:

v.values.item(0) 

die Standard-Python-Skalare zurückzukehren. Wenn Sie auf alle Werte als eine dichte Struktur zugreifen möchten:

v.toArray().tolist() 
+0

Dies funktionierte nicht für mich. – user2205916

+2

@ user2205916 Hier gibt es ein reproduzierbares Beispiel. Interessiert zu erklären, was __didnot Arbeit __? :) – zero323

+1

Das hat bei mir nicht funktioniert, bis ich 'lit (1)' in 'lit (0)' geändert habe ... was ich aus deinem reproduzierbaren Beispiel ableiten konnte. So danke! –