2016-05-24 8 views
0

Ich habe ein Spark-Datenframe mit einer Spalte, die String-Werte enthält (z. B. 'xyztext \ afadfa'). Ich mag eine neue Spalte erstellen, in dem der Wert ‚0‘ oder ‚1‘ je nachdem, ob die ursprüngliche Spalte enthielt bestimmten Text (zB ‚Text‘)Erstellen einer neuen Spalte mit Funktion in Spark Datareframe basierend auf einer String-Suche einer anderen Spalte

Beispiel des Ergebnisses:

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

EDIT: Ich habe dies zuvor versucht (und jetzt hinzugefügt .cast (int)) dank SGVD, aber erhalten 'Spalte ist nicht aufrufbar' Fehler, wenn ich den Spaltennamen einfügen: df1 = df.withColumn ('Target', d.f.column. enthält ('text'). cast ('int'))

Das Beste, was ich bisher erreicht habe, ist das Erstellen einer Spalte mit 0's darin:

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

Ich habe auch versucht, eine if then else Anweisung, um den Vektor zu schaffen, aber habe kein Glück:

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

Antwort

3

Spark-Spalten haben ein cast Verfahren zwischen den Typen zu werfen, und Sie können einen boolean Typen umwandeln zu einer Ganzzahl, wobei True zu 1 und False zu 0 umgewandelt wird. In Scala könnten Sie Column#contains verwenden, um nach einem Teilstring zu suchen. PySpark hat diese Methode nicht, aber Sie können stattdessen die instr Funktion:

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

Sie können diese Funktion auch als SQL-Ausdruck schreiben:

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

Oder vollständig in SQL ohne die Besetzung:

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

Vielen Dank für Ihre Hilfe. Weißt du zufällig, warum ich diesen Fehler immer wieder bekomme, wenn ich den Spaltennamen eingebe? TypeError Traceback (letzter Aufruf zuletzt) ​​ in () ----> 1 df2 = df1.withColumn ('Ziel', df.cursurist.contains ('text'). cast ('int')) TypeError: Objekt 'Spalte' ist nicht aufrufbar – W4K1NG

+0

Ich nahm fälschlicherweise an, dass eine Scala-Methode auch in PySpark verfügbar war. Ich habe meine Antwort mit einigen tatsächlich funktionierenden Beispielen bearbeitet. – sgvd

+0

Prost - vielen Dank. – W4K1NG

Verwandte Themen