Erzeugen einen Funken StructType / Schema von Fall Klasse
Wenn ich wollte eine StructType
(d.h. eine DataFrame.schema
) aus einem case class
gibt es einen Weg, es zu tun, ohne eine DataFrame
? Das kann ich leicht tun:
case class TestCase(id: Long)
val schema = Seq[TestCase]().toDF.schema
Aber es scheint übertrieben, tatsächlich erstellt einen DataFrame
wenn alles was ich will ist das schema.
(Wenn Sie neugierig sind, der Grund hinter der Frage ist, dass ich die Definition eines UserDefinedAggregateFunction
, und zu tun, so überschreiben Sie ein paar Methoden, die Rückkehr StructTypes
und ich use case-Klassen.)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie auf dieselbe Art und Weise
SQLContext.createDataFrame
es macht:o.a.s.sql.catalyst
noch. Und ich dachte gerade, ich hätte angefangen mitcreateDataFrame
genau wie Sie es Tat.:-(
...schemaFor[(Long,Int,Long)]...
Product
, danke Scala!toDF
version nur für frische, obwohlEncoders
in einer anderen Antwort, alleorg.apache.spark.sql.catalyst
als experimentell eingestuft (z.B. es ist nicht in der online-Dokumentation): github.com/apache/spark/blob/v2.4.0/sql/catalyst/src/main/scala/...Ich weiß, diese Frage ist fast ein Jahr alt, aber ich stieß es und dachte, die anderen, die auch wissen möchte, dass ich gerade gelernt haben, um diesen Ansatz verwenden:
Encoders
Objekt ist gekennzeichnet durch die@Experimental
Anmerkung: "Eine experimentelle user-facing-API. Experimentelle API ' s ändern kann oder entfernt werden in minor-Versionen des Spark, oder angenommen werden als first-class-Spark-API." Entdeckt, dass, in einer Anstrengung, um herauszufinden, vor - /Nachteile der verschiedenen Ansätze (aktuelle Antwort vs akzeptierte Antwort.)den Fall, dass jemand will, dies zu tun für eine benutzerdefinierte Java-bean:
Encoders.bean(Event.class).schema()
was ich davon ausgehen, das gleiche tut.Statt manuell reproduzieren die Logik für die Erstellung der impliziten
Encoder
- Objekt übergeben bekommt, umtoDF
kann man verwenden, die direkt (oder, genauer gesagt, die implizit in der gleichen Weise wietoDF
):Leider tatsächlich leidet unter dem gleichen problem wie mit
org.apache.spark.sql.catalyst
oderEncoders
wie in den anderen Antworten: dieEncoder
Eigenschaft ist experimentell.Wie funktioniert das? Die
toDF
Methode aufSeq
stammt aus einerDatasetHolder
", der über die implizitelocalSeqToDatasetHolder
, die importiert werden, überspark.implicits._
. Die Funktion ist folgendermaßen definiert:Wie Sie sehen können, dauert es eine
implicit
Encoder[T]
argument, was für einencase class
, kann berechnet werden übernewProductEncoder
(auch importiert überspark.implicits._
). Wir reproduzieren diese implizite Logik, um eineEncoder
für unseren Fall Klasse, über die Bequemlichkeitscala.Vordef.implizit
(im Lieferumfang standardmäßig, weil es vonPredef
), der nur gibt die angeforderten implizite argument: