2017-03-23 1 views
1

Ich habe einen Dienst (Secor), der rohe Nachrichten, die in Parkettdateien empfangen werden, schreibt. Ich möchte ein vordefiniertes Schema für diese Parkettdateien erstellen, damit Spark mehrere Dateien mit möglichen Änderungen im Schema kombinieren kann.Wie erstellt man ein vordefiniertes Schema für Spark?

Wir Funken verwenden 2.1.0

Ausgearbeitt Beispiel: Wir speichern Daten für einen ganzen Tag unter Ordner das Datum trägt, und unter jedem Zeitpunkt haben wir die von Stunde getrennt Daten. Das heißt, unsere Parkett-Dateien wie folgt aussehen:

date=2017-03-23 
    |-- hour=00 
    |-- hour=01 
    // 
    |-- hour=23 

sagen wir mal das Schema die auf Parkett analysiert Nachrichten enthalten nur zwei Felder am Anfang des Tages sagen:

root 
    |-- user: String 
    |-- id: Long 

jetzt um die Mittagszeit , wev'e hinzugefügt ein anderes Feld, so dass das Schema wird:

root 
    |-- user: String 
    |-- id: Long 
    |-- country: String 

das bedeutet, dass, wenn wir versuchen, die Daten des ganzen Tages zu lesen sparksession.read.parquet.("s3a://bucket/date=2017-03-23") verwenden, werden Funken durch Absturz zu der Tatsache, dass die Unterordner nicht das gleiche Schema haben. s ändern wir selten das Schema, ich bevorzuge nicht die Schemaverschmelzungsoption zu verwenden, da es sehr teuer ist.

Fazit: Was ich tun möchte ist ein Schema vordefinieren und speichern Sie es unter date=2017-03-23, und so Funken wissen, welche Spalten zu suchen, und fügen Sie null, wo die Spalte fehlt. In Spark 1.6 gab es _metadata Dateien, aber es scheint, dass in Spark 2.1 sie nicht mehr da sind.

Wie kann ich diese Schemadateien für Spark manuell erstellen?

Antwort

0

Wenn Sie es nicht mit Funken tun können, ich denke, es ist nicht kompliziert, eine Klasse zu erstellen, die ein JSON in ein Schema umwandeln, und speichern Sie dann Ihre JSON-Datei für jeden Tag.

+0

Ja, aber wo und wie kann ich es speichern, damit Spark es als Schema bezeichnet? – shakedzy

+0

Sie können die Datei schema.json im date = 2017-03-23-Verzeichnis speichern und dann als json lesen und das json-Schema umwandeln: Beispiel json {"name": "id", "type": "string"} wird Schema = StructType (Seq (StructFiel ("id", StringType, true))) – Mehrez

+0

das ist eine Option, obwohl ich gehofft hatte, eine implizite Art und Weise zu finden, in der Spark es selbst bei der Untersuchung der Dateien macht – shakedzy

Verwandte Themen