2017-03-15 8 views
2

Ich möchte eine JSON-Datei und zuordnen, so dass eine der Spalten eine Teilzeichenfolge eines anderen ist. Zum Beispiel mit der linken Tabelle zu nehmen und die richtige Tabelle erzeugen:create substring Spalte in Spark Dataframe

------------    ------------------------ 
|  a  |    |  a  | b | 
|------------|  -> |------------|---------| 
|hello, world|    |hello, world| hello | 

Ich kann diese mit Funken SQL-Syntax zu tun, aber wie kann es mit Hilfe der in-integrierten Funktionen getan werden?

+0

Will Spalte ein immer zwei Wörter durch ein Komma begrenzt sein? Und wird Spalte b immer das erste Wort sein? – soote

+0

nein und nein, idealerweise sollte die Lösung eine Teilzeichenkettenfunktion über Spalte a laufen lassen, um Spalte b zu produzieren –

Antwort

4

Eine solche Aussage kann

import org.apache.spark.sql.functions._ 

dataFrame.select(col("a"), substring_index(col("a"), ",", 1).as("b"))

3

würden Sie verwenden die Funktion withColumn

import org.apache.spark.sql.functions.{ udf, col } 
def substringFn(str: String) = your substring code 
val substring = udf(substringFn _) 
dataframe.withColumn("b", substring(col("a")) 
+1

UDFs sind schlecht, weil, je nachdem, was Sie in ihnen tun, der Abfrageplaner/-optimierer möglicherweise nicht in der Lage sein wird, es durchzusehen . –

+0

@ JonWatte Das ist ein guter Punkt. Denken Sie daran, dass es in einigen Fällen Fälle gibt, in denen die Funktionen, die Funken liefern, nicht ausreichen, zum Beispiel: Konvertieren von Long-/Lat-Spalten in einen Geohash. – soote

1

Angenommen, Sie die folgende Datenrahmen haben verwendet werden:

import spark.implicits._ 
import org.apache.spark.sql.functions._ 

var df = sc.parallelize(Seq(("foobar", "foo"))).toDF("a", "b") 

+------+---+ 
|  a| b| 
+------+---+ 
|foobar|foo| 
+------+---+ 

Sie könnten eine neue Spalte aus der ersten Spalte der Teilmenge wie folgt:

df = df.select(col("*"), substring(col("a"), 4, 6).as("c")) 

+------+---+---+ 
|  a| b| c| 
+------+---+---+ 
|foobar|foo|bar| 
+------+---+---+