2017-12-26 30 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

나는 당신의 제안을 사용하고 spa sql in scala를 사용하여 답을 얻었다. 먼저 임시 테이블로 데이터 프레임을 등록한 다음 UDF를 spark sql에 저장 한 다음 쿼리를 실행하고 보일 수 있습니다. 내 대답이있어. 당신의 도움을 주셔서 감사합니다. 당신은 챔피언입니다 :) – Sree51

0

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이고 상태는 내 데이터 프레임 열입니다.