2016-09-13 16 views
0

私はSparkでDataframeを持っていますが、値が "_P"で終わっている単純な正規表現に基づいて異なる列の値を置き換えたいと思います。 1 "に、" _N "で終わる場合は" -1 "に置き換えます。私は同じ交換を行うために必要な複数の列があります。私はまた、最後にキャスティングをする必要があります。regexpを使用してSpark DataFrameの文字列を置き換える方法

+2

あなたは何を試しましたか、なぜそれが機能しませんでしたか? –

+0

私はdf.na.replaceを試しました(列、Map( "" [a-zA-Z0-9] _P " - >" 1 "、" [a-zA-Z0-9] _N " ))。それは働いていない –

答えて

2

"when( 'column.endsWith(" _ P ")、lit(" 1 "))。when ..."のような式で行うことができます。 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| 
+----+-----+------+ 
*/ 

EDIT

ところで

、あなたがしようとしたものについてあなたのコメントについて:「df.na」機能がNULL値を含む行上で動作するように意図され、だから、たとえあなたが試したことが働いても、nullを含む行に対してのみ動作します。それを除けば、 "置換"は正規表現では機能しません。

乾杯

関連する問題