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/...
InformationsquelleAutor dlamblin | 2017-05-25
Schreibe einen Kommentar