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
以下のように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...|
+--------------------+
あなたが質問に投稿した出力に従って、私は正規表現を使用しました。ニーズに合わせて変更できます。
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...|
+--------------------+
私はAmit Kumarの提案を取り入れてUDFを作成し、spark sql:
データフレームから人として単語(ステータス)を選択します
「Words」は私のUDFで、ステータスは私のデータフレーム列です。