首页 > 解决方案 > pyspark udf clean html标签得到typeerror

问题描述

我是 pyspark 的新手,我无法将 python 函数转换为 pyspark udf。

我有一个 df 如下

+--------------------+
|             summary|
+--------------------+
|<p>test test </p>   |
|<a>test test </a>   |
|<p>test test </p>   |
+--------------------+

我想清理 .html 中的 html 标签summary。我创建了一个如下的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

这样做的正确方法是什么?

标签: apache-sparkpysparkapache-spark-sql

解决方案


可以避开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 提供的原生函数来解决您的需求。

PythonUDF对 JVM 的性能有影响,这在他们的书中有所提及Spark The Definitive Guide,您也可以在此处看到讨论:Spark 函数与 UDF 性能?


推荐阅读