Чтобы ваша функция работала, вы должны создать столбец массива для сравнения:
df.select(fn.array([fn.lit(i) for i in key_labels])).show(truncate=False)
+----------------------------------+
|array(COMMISSION, COM, PRET, LOAN)|
+----------------------------------+
|[COMMISSION, COM, PRET, LOAN] |
|[COMMISSION, COM, PRET, LOAN] |
+----------------------------------+
Таким образом, ваш код будет выглядеть следующим образом:
def containsAny(string, array):
if len(string) == 0:
return False
else:
return (any(word in string for word in array))
contains_udf = fn.udf(containsAny, T.BooleanType())
(df.withColumn("keyword_match", contains_udf(fn.col("original"),
fn.array([fn.lit(i) for i in key_labels])))).show()
Выходы:
+----------+---+-------------+
| original| id|keyword_match|
+----------+---+-------------+
|COMMISSION| 1| true|
|CAMMISSION| 2| false|
+----------+---+-------------+
Однако вы также можете использовать isin
:
df.withColumn('keyword_match',df['original'].isin(key_labels)).show()
+----------+---+-------------+
| original| id|keyword_match|
+----------+---+-------------+
|COMMISSION| 1| true|
|CAMMISSION| 2| false|
+----------+---+-------------+