2016-06-27 12 views
0

Ich habe eine Tabelle mit einer Spalte des Typs String. Ich möchte eine weitere Spalte mit einem Teil der Kette erhalten, die durch die Position des Zeichens "-" definiert ist.indexOf Funktion auf Datenrahmen

Beispiel: Die Spalte hat den Wert YX-1F2 und ich möchte YX als Spalte erhalten.

Das ist, was ich bisher versucht habe:

application_rules.where((application_rules("apprul_cd_fare_basis").contains("-")===true) && (application_rules("apprul_cd_fare_basis").startsWith("-")===false) && (application_rules("apprul_cd_fare_basis").endsWith("-")===false)) 
.select(application_rules("apprul_cd_fare_basis"), application_rules("apprul_cd_fare_basis").substr(0, application_rules("apprul_cd_fare_basis").toString().indexOf("-"))) 
.show() 

Aber das ist für mich nicht funktioniert, weil ich immer die indexOf („-“) Funktion -1 zurück. Irgendeine Idee, was ist meine Schuld und wie man es repariert? Hier

Antwort

0

ist das Problem:

application_rules("apprul_cd_fare_basis").toString().indexOf("-") 

Die toString() Funktion hier kehrt die Titel der ausgewählten Spalte, die apprul_cd_fare_basis hier. Es ist nicht der Wert, den Sie erwartet haben. indexOf("-") sucht also nicht im Wert, sondern im Spaltentitel.

Lösung

Wenn Sie nur eine Spalte mit extrahierter Teil aus dem String (beispielsweise YX von YX-1F2) hinzufügen möchten, können Sie einfach tun:

import org.apache.spark.sql.functions.substring_index 

application_rules.withColumn(
    "newColumnName", 
    substring_index(application_rules("apprul_cd_fare_basis"), "-", 1) 
    ) 

Ergebnis

+--------------------+-------------+ 
|apprul_cd_fare_basis|newColumnName| 
+--------------------+-------------+ 
|    YX-1F2|   YX| 
|    AB-0G1|   AB| 
+--------------------+-------------+