在Spark数据框中使用UDF进行文本挖掘

时间:2016-03-10 00:17:30

标签: apache-spark apache-spark-sql user-defined-functions apache-spark-mllib

我有以下功能

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+")
}

3 个答案:

答案 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"))

您还可以找到ml.feature.Tokenizeml.featureRegexTokenizer

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