从Spark数据框中的字符串列中提取单词

Sre*_*e51 4 regex scala apache-spark

我在spark数据框中有一个带有文本的列。

我想提取所有以特殊字符开头的单词,'@'regexp_extract从该文本列的每一行中使用。如果文本包含多个以'@'它开头的单词,则仅返回第一个。

我正在寻找提取与我的火花模式匹配的多个单词。

data_frame.withColumn("Names", regexp_extract($"text","(?<=^|(?<=[^a-zA-Z0-9-_\.]))@([A-Za-z]+[A-Za-z0-9_]+)",1).show
Run Code Online (Sandbox Code Playgroud)

输入样例: @always_nidhi @YouTube no i dnt understand bt i loved the music nd their dance awesome all the song of this mve is rocking

样本输出: @always_nidhi,@YouTube

Ami*_*mar 6

您可以在spark中创建udf函数,如下所示:

import java.util.regex.Pattern
import org.apache.spark.sql.functions.udf
import org.apache.spark.sql.functions.lit

def regexp_extractAll = udf((job: String, exp: String, groupIdx: Int) => {
      println("the column value is" + job.toString())
      val pattern = Pattern.compile(exp.toString)
      val m = pattern.matcher(job.toString)
      var result = Seq[String]()
      while (m.find) {
        val temp = 
        result =result:+m.group(groupIdx)
      }
      result.mkString(",")
    })
Run Code Online (Sandbox Code Playgroud)

然后按如下所示调用udf:

data_frame.withColumn("Names", regexp_extractAll(new Column("text"), lit("@\\w+"), lit(0))).show()
Run Code Online (Sandbox Code Playgroud)

在上面,您将得到如下输出:

+--------------------+
|               Names|
+--------------------+
|@always_nidhi,@Yo...|
+--------------------+
Run Code Online (Sandbox Code Playgroud)

根据您在问题中发布的输出,我使用了正则表达式。您可以对其进行修改以适合您的需求。