J'ai un udf qui renvoie une liste de chaînes. cela ne devrait pas être trop difficile. Je passe le type de données lors de l'exécution du udf car il retourne un tableau de chaînes: ArrayType(StringType)
.
Maintenant, d'une manière ou d'une autre, cela ne fonctionne pas:
la trame de données sur laquelle j'opère est df_subsets_concat
et ressemble à ceci:
df_subsets_concat.show(3,False)
+----------------------+
|col1 |
+----------------------+
|oculunt |
|predistposed |
|incredulous |
+----------------------+
only showing top 3 rows
et le code est
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))
et le résultat est
/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
Je crois comprendre que c'était la bonne façon de procéder. Voici quelques ressources: pySpark Data Frames "assert isinstance (dataType, DataType)," dataType should be DataType "Comment retourner un" Tuple type "dans un UDF dans PySpark? =
Mais aucun de ces éléments ne m'a aidé à comprendre pourquoi cela ne fonctionne pas. j'utilise pyspark 1.6.1.
Comment créer un udf dans pyspark qui retourne un tableau de chaînes?
Vous devez initialiser une instance StringType
:
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]|
+------------+------+