2017-03-14 3 views
0

Hallo von einem Funken Anfänger!Scala Spark: Datensatz mit JSON Spalten

Ich habe einen DataFrame, der mehrere Spalten enthält, sagen wir ID, Name und Eigenschaften. Alle von ihnen sind vom Typ String. Die letzte Spalte, Eigenschaften, enthält eine JSON-Darstellung einiger Eigenschaften des Objekts.

Ich bin auf der Suche nach einer Möglichkeit, über den DataFrame zu iterieren, JSON analysieren und ein bestimmtes JSON-Feld aus jedem Element extrahieren - und an die Zeile des DataFrame anhängen.

Bis jetzt ein bisschen verloren - ich weiß, dass Spark JSON-Datensätze importieren kann (das ist nicht, was ich habe ..) und dass es eine net.liftweb.json-Bibliothek, aber leider habe ich keinen Weg zu finden es arbeiten -

val users = sqlContext.table("user") 
    .withColumn("parsedProperties", parse($"properties")) 

gibt einen TypeMismatch - analysieren() Funktion einen String erwartet, und ich bin es einen Spaltennamen sendet.

Beachten Sie, dass ich kein Set-Schema für diese JSON-Spalte habe.

Vielen Dank im Voraus!

+0

Sieht aus wie diese helfen: https://jaceklaskowski.gitbooks.io/mastering-apache-spark/spark-sql-udfs.html –

Antwort

1

Sie müssen hier ein UDF erstellen, aus der Funktion Parse, und wenden Sie dann das UDF auf die Spalte.

import org.apache.spark.sql.functions.udf 
val parse_udf = udf(parse _) 

val users = sqlContext.table("user") 
    .withColumn("parsedProperties", parse_udf($"properties")) 
0

Jetzt arbeiten! Vielen Dank!

val getEmail: String => String = parse(_).asInstanceOf[JObject].values.getOrElse("email", "").toString 
val getEmailUDF = udf(getEmail) 
val users = sqlContext.table("user") 
    .withColumn("email", getEmailUDF($"properties"))