web-dev-qa-db-ja.com

spark dataframeの文字列列から単語を抽出します

spark dataframeにテキストがある列があります。

特殊文字'@'で始まるすべての単語を抽出し、そのテキスト列の各行からregexp_extractを使用しています。テキストに'@'で始まる複数の単語が含まれている場合、最初の単語のみが返されます。

スパークで私のパターンに一致する複数の単語を抽出することを探しています。

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

入力例:@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

5
Sree51

以下のように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(",")
    })

次に、以下のようにudfを呼び出します。

data_frame.withColumn("Names", regexp_extractAll(new Column("text"), lit("@\\w+"), lit(0))).show()

上記では、次のように出力されます。

+--------------------+
|               Names|
+--------------------+
|@always_nidhi,@Yo...|
+--------------------+

あなたが質問に投稿した出力に従って、私は正規表現を使用しました。ニーズに合わせて変更できます。

7
Amit Kumar

Java RegEx を使用して、これらの単語を抽出できます。以下は作業コードです。

val sparkConf = new SparkConf().setAppName("myapp").setMaster("local[*]")
val sc = new SparkContext(sparkConf)

val sqlContext = new org.Apache.spark.sql.SQLContext(sc)
import sqlContext.implicits._
import org.Apache.spark.sql.functions.{col, udf}
import Java.util.regex.Pattern

//User Defined function to extract
def toExtract(str: String) = {      
  val pattern = Pattern.compile("@\\w+")
  val tmplst = scala.collection.mutable.ListBuffer.empty[String]
  val matcher = pattern.matcher(str)
  while (matcher.find()) {
    tmplst += matcher.group()
  }
  tmplst.mkString(",")
}

val Extract = udf(toExtract _)
val values = List("@always_nidhi @YouTube no i dnt understand bt i loved the music nd their dance awesome all the song of this mve is rocking")
val df = sc.parallelize(values).toDF("words")
df.select(Extract(col("words"))).show()

出力

+--------------------+
|          UDF(words)|
+--------------------+
|@always_nidhi,@Yo...|
+--------------------+
2
Souvik

私はAmit Kumarの提案を取り入れてUDFを作成し、spark sql:

データフレームから人として単語(ステータス)を選択します

「Words」は私のUDFで、ステータスは私のデータフレーム列です。

0
Sree51