web-dev-qa-db-fra.com

Comment créer un udf dans PySpark qui retourne un tableau de chaînes?

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?

11
Hunle

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]|
+------------+------+
22
Psidom