我有以下功能
TextView
哪些需要应用于列"标题"在数据框df_article中。 如何使用UDF在spark中实现这一点?。
样本数据
def tokenize(text : String) : Array[String] = {
// Lowercase each word and remove punctuation.
text.toLowerCase.replaceAll("[^a-zA-Z0-9\\s]", "").split("\\s+")
}
答案 0 :(得分:2)
您可以这样定义UDF:
import org.apache.spark.sql.functions.udf
val myToken = udf((xs: String) => xs.toLowerCase.replaceAll("[^a-zA-Z0-9\\s]", "").split("\\s+"))
并使用附加列创建一个新的数据框:
df_article.withColumn("newTitle", myToken(df_article("title")))
或者,您也可以使用以下代码注册tokenize
功能
val tk = sqlContext.udf.register("tk", tokenize _)
并通过应用获取新数据框:
df_article.withColumn("newTitle", tk(df_article("title")))
答案 1 :(得分:2)
我根本不会在这里使用UDF。您可以使用内置表达式以安全且更有效的方式轻松编写相同的函数:
import org.apache.spark.sql.Column
import org.apache.spark.sql.functions.{lower, regexp_replace, split}
def tokenize(c: Column) = split(
regexp_replace(lower(c), "[^a-zA-Z0-9\\s]", ""), "\\s+"
)
df.select(tokenize($"title"))
答案 2 :(得分:0)
为什么要使用UDF ?,您可以使用内置函数
以下是pyspark中的示例:
from pyspark.sql.functions import regexp_replace, lower
df_article.withColumn("title_cleaned", lower((regexp_replace('title', '([^a-zA-Z0-9\&\b]+)', " "))))
检查内置功能:
https://spark.apache.org/docs/latest/api/python/pyspark.sql.html#pyspark.sql.functions.first