2017-12-26 29 views
0

テキストを含むスパークデータフレームの列があります。スパークデータフレームの文字列から単語を抽出します。

特殊文字'@'で始まるすべての単語を抽出し、そのテキスト列の各行から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

+0

関数定義によると、regexp_extractは最初の一致のみを返し、可能なすべての一致を見つけるためにテキスト全体を反復処理しません。すべての一致について反復処理を行い、結果をリストとして返すためには、独自のUDFを書く必要があります。 –

+0

こんにちは@AmitKumar、それで助けてください。私はスカラとスパークに慣れておらず、学びたいと思っています。 – Sree51

+0

サンプルデータと期待される出力を投稿できますか? – philantrovert

答えて

0

あなたは以下のようにスパークでの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...| 
+--------------------+ 

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

+0

私はあなたの提案を使用し、spark sql scalaで答えを得ました。最初に私のデータフレームをtempテーブルとして登録し、spark sqlに自分のUDFを保存してから、クエリとボイルを実行しました。私は私の答えを得た。ご協力いただきありがとうございます。あなたはチャンピオンです:) – Sree51

0

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を作成し、スパークSQLでそれを実行した

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

出力:から人として

選択単語(ステータス)データフレーム

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

関連する問題