我是pyspark的新手,在将python函数转换为pyspark udf时遇到问题。
我的df如下
+--------------------+
| summary|
+--------------------+
|<p>test test </p> |
|<a>test test </a> |
|<p>test test </p> |
+--------------------+
我想清理summary
中的html标签。我创建了如下的udf
import re
clean_html = udf(lambda raw: re.sub(re.compile('<.*?>'), '', raw))
df.withColumn('clean', clean_html(df.summary))
,但是在运行时出现以下错误:
TypeError: Invalid argument, not a string or column
什么是正确的方法?
答案 0 :(得分:1)
您可以避免使用udf函数,而直接使用regexp_replace
# First import regexp_replace
from pyspark.sql.functions import regexp_replace
# Creates the dataframe
# [...]
# Pass the column, regex and replacement value
df = df.withColumn('clean', regexp_replace(df.summary, r'<.*?>', ''))
df.show()
输出:
+-----------------+----------+
| summary| clean|
+-----------------+----------+
|<p>test test </p>|test test |
|<a>test test </a>|test test |
+-----------------+----------+
在创建UDF
之前,请始终检查Spark是否提供了本机功能来满足您的需求。
Python UDF
对JVM的性能有影响,这在他们的书Spark The Definitive Guide
中已有提及,这里也有一个讨论,您也可以看到:Spark functions vs UDF performance?
答案 1 :(得分:0)
您以错误的方式将列传递给UDF! 试试这个:
import re
clean_html = udf(lambda raw: re.sub(re.compile('<.*?>'), '', raw))
df.withColumn('clean', clean_html("summary"))
或者这个:
import re
clean_html = udf(lambda raw: re.sub(re.compile('<.*?>'), '', raw))
df.withColumn('clean', clean_html(col("summary")))
和结果:
+-----------------+----------+
| summary| clean|
+-----------------+----------+
|<p>test test </p>|test test |
|<a>test test </a>|test test |
+-----------------+----------+