2016-09-13 10 views
0

Spark에서 Dataframe을 사용하고 있으며 값이 "_P"로 끝나는 간단한 일반 표현식을 기반으로 다른 열 값을 바꾸려면 " 1 "로 끝나고"_N "으로 끝나는 경우"-1 "로 바꿉니다. 동일한 교체 작업을 수행하는 데 필요한 여러 열이 있습니다. 나는 또한 끝에 캐스팅을해야합니다.regexp를 사용하여 Spark DataFrame에서 문자열을 대체하는 방법

+2

시도한 이유는 무엇인가요? –

+0

df.na.replace (column, Map (""[a-zA-Z0-9] _P "->"1 ","[a-zA-Z0-9] _N "->"-1 ")). 작동하지 않습니다. –

답변

2

"when ('column.endsWith ("_ P "), lit ("1 ")). ..."과 같은 표현식을 통해 수행 할 수 있습니다. regexp_replace를 사용하여 동일한 결과를 얻을 수 있습니다. 다음은 사용 예 년대 때

val myDf = sc.parallelize(Array(
    ("foo_P", "bar_N", "123"), 
    ("foo_N", "bar_Y", "123"), 
    ("foo", "bar", "123"), 
    ("foo_Y", "bar_XX", "123") 
)).toDF("col1", "col2", "col3") 

val colsToReplace = Seq("col1", "col2") 

import org.apache.spark.sql.Column 

val castValues = (colName: String) => { 
    val col = new Column(colName) 

    when(col.endsWith("_P"), lit("1")) 
    .when(col.endsWith("_F"), lit("-1")) 
    .otherwise(col) 
    .as(colName) 
} 

val selectExprs = myDf.columns.diff(colsToReplace).map(new Column(_)) ++ colsToReplace.map(castValues) 

myDf.select(selectExprs:_*).show 
/* 
+----+-----+------+ 
|col3| col1| col2| 
+----+-----+------+ 
| 123| 1| bar_N| 
| 123|foo_N| bar_Y| 
| 123| foo| bar| 
| 123|foo_Y|bar_XX| 
+----+-----+------+ 
*/ 

편집

그런데

, 당신이 뭘하려에 대한 내 댓글에 대한 다음 "df.na"기능이 NULL 값을 포함하는 행에서 작동하기위한 것입니다, 그래서, 비록 당신이 시도한 작업을 null로 포함 된 행에서만 작동합니다. 그 외에도 "바꾸기"는 정규 표현식에서 작동하지 않습니다. 적어도 내가 마지막으로 확인한 것은 아닙니다.

건배

관련 문제