Verarbeitung von json-strings in einem Spark-dataframe Spalte
Als ich nach Möglichkeiten suchen, Parsen von json in einen string-Spalte ein dataframe, das ich immer wieder mit Ergebnissen, die mehr Lesen Sie einfach die json-Datei Quellen. Meine Quelle ist eigentlich ein Bienenstock ORC Tabelle mit einige strings in eine der Spalten, die in einer json-format. Ich möchte wirklich, um zu konvertieren, dass etwas analysiert, wie eine Karte.
Ich habe Probleme, Suche nach einem Weg, dies zu tun:
import java.util.Date
import org.apache.spark.sql.Row
import scala.util.parsing.json.JSON
val items = sql("select * from db.items limit 10")
//items.printSchema
val internal = items.map {
case Row(externalid: Long, itemid: Long, locale: String,
internalitem: String, version: Long,
createdat: Date, modifiedat: Date)
=> JSON.parseFull(internalitem)
}
Ich dachte, das sollte funktionieren, aber vielleicht gibt es eine Funke Weg, dies zu tun, weil stattdessen erhalte ich die folgende Fehlermeldung:
java.lang.ClassNotFoundException: scala.Any at scala.reflect.internal.util.AbstractFileClassLoader.findClass(AbstractFileClassLoader.scala:62)
Speziell, mein input-Daten sieht etwa wie folgt aus:
externalid, itemid, locale, internalitem, version, createdat, modifiedat
123, 321, "en_us", "{'name':'thing','attr':{
21:{'attrname':'size','attrval':'big'},
42:{'attrname':'color','attrval':'red'}
}}", 1, 2017-05-05…, 2017-05-06…
Ja, es ist nicht RFC-7158 genau.
Den attr
Schlüssel können 5 bis 30 alle Werte von 80.000, also wollte ich um etwas zu bekommen, wie dieses, statt:
externalid, itemid, locale, internalitem, version, createdat, modifiedat
123, 321, "en_us", "{"name':"thing","attr":[
{"id":21,"attrname':"size","attrval":"big"},
{"id":42,"attrname":"color","attrval":"red"}
]}", 1, 2017-05-05…, 2017-05-06…
Dann glätten Sie die internalitem
Felder und explodieren die attr
array:
externalid, itemid, locale, name, attrid, attrname attrval, version, createdat, modifiedat
123, 321, "en_us", "thing", 21, "size", "big", 1, 2017-05-05…, 2017-05-06…
123, 321, "en_us", "thing", 21, "color", "red", 1, 2017-05-05…, 2017-05-06…
- dieser code erstellt ein neues dataframe durch das Parsen der Daten-Feld in der Quelle dataframe.
spark.sqlContext.read.json(df.select("col1").rdd.map(_.getAs[String](0)))
- ja, also, wenn Sie tun, dass Sie nicht mehr können, Lesen Sie in den anderen Spalten nach den json geparst wird, obwohl, Recht? Wenn ich Z.B. abgeflacht, was in der json und wollte die Ausgabe aller Spalten zusammen mit den neuen, wie würde das gemacht?
- Haben Sie sich das hier an: stackoverflow.com/questions/35068792/... -- ich denke die explodieren Methode sollte Ihnen dabei helfen, genau das zu tun. Natürlich - es kann nicht funktionieren, wenn Sie kommen aus orc. Dies könnte Ihnen helfen, extrahieren Sie die JSON stackoverflow.com/questions/34069282/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich habe noch nie mit solchen Berechnungen, aber ich habe einen Rat für Sie :
Bevor Sie jeder Betrieb auf Spalten, die sich auf Ihre eigenen, nur überprüfen Sie das sql.Funktionen-Paket, das enthält eine ganze Reihe von hilfreichen Funktionen für die Arbeit mit Spalten wie Datum extrahieren und formatieren, string-Verkettung und spliting, ... und Sie bieten auch eine Reihe von Funktionen zur Arbeit mit json-Objekten wie :
from_json
undjson_tuple
.Verwenden diese Methoden, die Sie einfach brauchen, um Sie zu importieren und rufen Sie Sie in einer select-Methode so :
Zunächst müssen Sie ein schema erstellen, für Ihre json-Spalte und legen Sie es in den
schema
variableHoffe, es hilft.
df.select($"externalid", $"itemid", … from_json($"internalitem", schema), $"version" …)
?