2016-05-24 6 views
0

文字列値を含む列(たとえば 'xyztext \ afadfa')を持つスパークデータフレームを持っています。私は別の列の文字列検索に基づいてSpark Dataframeで関数を使用して新しい列を作成します。

値が元の列は、特定のテキスト(すなわち、「テキスト」)を含んでいるかどうかに応じて、「0」または「1」のある新しい列を作成したい結果の例:

## +---+---+------+---------+ 
## | x1| x2| x3 | xnew | 
## +---+---+------+---------+ 
## | 1| a| xtext| 1 | 
## | 3| B| abcht| 0 | 

EDIT:私は以前これを試してみましたが、SGVDのおかげで.cast(int)を追加しましたが、カラム名を挿入すると 'カラムがコール可能ではありません'というエラーが発生します。 df1 = df.withColumn( 'Target'、df.column。

私が今までに達成した最高のものは、0を含む列を作成することです。

from pyspark.sql.functions import lit 
df1 = df.withColumn('Target', lit(0)) 

私はベクトルを作成する場合は、else文をも試してみましたが、運を持っていない午前:

def targ(string): 
    if df.column.contains('text'): return '1' 
    else: return '0' 

答えて

3

スパーク列は、タイプ間のキャストするcast方法を持っている、とあなたはboolean型をキャストすることができます整数に変換され、Trueは、1およびFalseから0にキャストされます。 Scalaでは、Column#containsを使用して部分文字列を確認できます。 PySparkは、このメソッドを持っていませんが、代わりにinstr機能を使用することができます。

import pyspark.sql.functions as F 
df1 = df.withColumn('Target', (F.instr(df.column, 'text') > 0).cast('int')) 

あなたはまた、SQL式としてこの関数を記述することができますキャストせずに

df1 = df.withColumn('Target', F.expr("INSTR(column, 'text') > 0").cast('int')) 

それとも、完全にSQLで:

df1 = df.withColumn('Target', F.expr("IF(INSTR(column, 'text') > 0, 1, 0)")) 
+0

ありがとうございました。私は列名を挿入すると、なぜこのエラーが発生し続けるのか知っていますか? TypeError Traceback(直近の最後のコール) ( ----> 1 df2 = df1.withColumn( 'Target'、df.csuristem.contains( 'text'))の TypeError: 'Column'オブジェクトは呼び出し可能ではありません – W4K1NG

+0

私は間違って、ScalaメソッドがPySparkでも利用可能であると仮定しました。私は実際に動作するいくつかの例で私の答えを編集しました。 – sgvd

+0

乾杯 - とても感謝します。 – W4K1NG

関連する問題