web-dev-qa-db-ja.com

文字列の配列を返すUDFをPySparkで作成する方法は?

文字列のリストを返すudfがあります。これは難しくありません。 udfを実行するときに、文字列の配列ArrayType(StringType)を返すため、データ型を渡します。

さて、どういうわけかこれは機能していません:

私が操作しているデータフレームはdf_subsets_concatそして次のようになります。

df_subsets_concat.show(3,False)
+----------------------+
|col1                  |
+----------------------+
|oculunt               |
|predistposed          |
|incredulous           |
+----------------------+
only showing top 3 rows

そしてコードは

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))

結果は

/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

これが正しい方法であったことは私の理解です。ここにいくつかのリソースがあります: pySpark Data Frames "assert isinstance(dataType、DataType)、" dataType should be DataType "PySparkのUDFで「タプルタイプ」を返す方法は?

しかし、これらのどちらも、なぜこれが機能しないのかを解決する助けにはなりませんでした。 pyspark 1.6.1を使用しています。

文字列の配列を返すpysparkでudfを作成する方法は?

11
Hunle

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