Ich habe ein udf, das eine Liste von Zeichenfolgen zurückgibt. das sollte nicht zu schwer sein. Ich übergebe den Datentyp bei der Ausführung von udf, da er ein Array von Zeichenfolgen zurückgibt: ArrayType(StringType)
.
Nun, irgendwie funktioniert das nicht:
der Datenrahmen, auf dem ich arbeite, ist df_subsets_concat
und sieht so aus:
df_subsets_concat.show(3,False)
+----------------------+
|col1 |
+----------------------+
|oculunt |
|predistposed |
|incredulous |
+----------------------+
only showing top 3 rows
und der Code ist
from pyspark.sql.types import ArrayType, FloatType, StringType
my_udf = lambda domain: ['s','n']
label_udf = udf(my_udf, ArrayType(StringType))
df_subsets_concat_with_md = df_subsets_concat.withColumn('subset', label_udf(df_subsets_concat.col1))
und das Ergebnis ist
/usr/lib/spark/python/pyspark/sql/types.py in __init__(self, elementType, containsNull)
288 False
289 """
--> 290 assert isinstance(elementType, DataType), "elementType should be DataType"
291 self.elementType = elementType
292 self.containsNull = containsNull
AssertionError: elementType should be DataType
Nach meinem Verständnis war dies der richtige Weg, dies zu tun. Hier sind einige Ressourcen: pySpark-Datenrahmen "behaupten, dass es sich um eine Instanz (Datentyp, Datentyp) handelt", "Datentyp sollte Datentyp sein"Wie wird ein "Tupeltyp" in einer UDF in PySpark zurückgegeben? =
Aber keiner von beiden hat mir geholfen, den Grund dafür zu klären. Ich benutze Pyspark 1.6.1.
Wie erstelle ich ein udf in pyspark, das ein Array von Strings zurückgibt?
Sie müssen eine StringType
-Instanz initialisieren:
label_udf = udf(my_udf, ArrayType(StringType()))
# ^^
df.withColumn('subset', label_udf(df.col1)).show()
+------------+------+
| col1|subset|
+------------+------+
| oculunt|[s, n]|
|predistposed|[s, n]|
| incredulous|[s, n]|
+------------+------+