pyspark udf clean html标签越来越TypeError

时间:2019-06-01 17:29:02

标签: pyspark

我是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

什么是正确的方法?

2 个答案:

答案 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 |
+-----------------+----------+