Einführung in das Laden semistrukturierter Daten

Unter diesem Thema werden semistrukturierte Daten beschrieben und Informationen zum Laden und Speichern dieser Daten in Snowflake bereitgestellt.

Unter diesem Thema:

Was sind semistrukturierte Daten?

Semistrukturierte Daten sind Daten, die nicht den Standards üblicher strukturierter Daten entsprechen. Sie enthalten Tags und andere Arten von Markierungen, die individuelle, unterschiedliche Einheiten innerhalb der Daten identifizieren.

Zwei der wichtigsten Attribute, die semistrukturierte Daten von strukturierten Daten unterscheiden, sind verschachtelte Datenstrukturen und das Fehlen eines festen Schemas:

  • Strukturierte Daten erfordern ein festes Schema, das definiert wird, bevor die Daten in ein relationales Datenbanksystem geladen und abgefragt werden können. Semistrukturierte Daten erfordern keine vorherige Definition eines Schemas und können sich ständig weiterentwickeln, d. h. es können jederzeit neue Attribute hinzugefügt werden.

    Darüber hinaus können Entitäten innerhalb derselben Klasse unterschiedliche Attribute haben, obwohl sie gruppiert sind, und die Reihenfolge der Attribute ist nicht wichtig.

  • Im Gegensatz zu strukturierten Daten, die Daten als flache Tabelle darstellen, können semistrukturierte Daten N-stufige Hierarchien verschachtelter Informationen enthalten.

Was sind hierarchische Daten?

Semistrukturierte Daten sind in der Regel hierarchisch organisiert. Komplexe Datenstrukturen lassen sich durch die Verschachtelung einfacherer Datentypen aufbauen, z. B. Arrays und Objects. (Hinweis: Eine Snowflake-OBJECT entspricht einem „dictionary“ (Wörterbuch) oder einer „map“ (Karte). Ein Snowflake-Objekt ist kein „object“ (Objekt) im Sinne der objektorientierten Programmierung.)

So können beispielsweise JSON-Daten ein Objekt enthalten, das ein Array enthält. Jede Zelle dieses Arrays kann selbst ein verschachteltes Objekt oder Array enthalten.

Sie können Snowflake-Datentypen verwenden, um eine Hierarchie für Ihre semistrukturierten Daten zu erstellen, indem Sie die folgenden Eigenschaften von Datentypen verwenden:

  • Ein VARIANT-Wert kann einen Wert eines beliebigen anderen Datentyps enthalten, einschließlich ARRAY oder OBJECT.

  • Ein ARRAY- oder OBJECT-Wert kann einen Wert vom Typ VARIANT enthalten.

Angenommen, Sie möchten die Datumsangaben zu verschiedene Typen von Naturkatastrophen speichern. Sie könnten ein OBJECT erstellen, das die Schlüssel „Hurrikane“, „Erdbeben“, „Flut“ usw. enthält. Der Wert, der mit jedem dieser Schlüssel verbunden ist, kann ein ARRAY sein, das die Datumsangaben zum Auftreten der jeweiligen Typen von Naturkatastrophen enthält. Da der Wert in jedem Schlüssel-Wert-Paar vom Typ VARIANT sein muss, würde jedes Datumsfeld als ARRAY innerhalb eines VARIANT innerhalb des entsprechenden OBJECT gespeichert werden. Die oberste Ebene der Hierarchie würde etwa wie folgt aussehen (die geschweiften Klammern stehen für ein OBJECT, das Schlüssel-Wert-Paare enthält):

{
    "Flood": flood_date_array::VARIANT,
    "Earthquake": earthquake_date_array::VARIANT,
    ...
}
Copy

Ein weiteres Beispiel: Sie möchten eine einzige Liste von Katastrophen in chronologischer Reihenfolge speichern. In diesem Fall könnte Ihr äußerer Datentyp ein ARRAY sein. Jede Zelle dieses ARRAY kann ein OBJECT (umhüllt von einem VARIANT) enthalten, das Schlüssel-Wert-Paare mit Informationen über das Ereignis enthält. Beispielsweise könnte jedes OBJECT, das ein Erdbeben beschreibt, Schlüssel wie „Zeitstempel“, „Ort“ und „Stärke“ haben. Jedes OBJECT, das einen Tornado beschreibt, könnte Schlüssel wie „Zeitstempel“ und „Maximale_Windgeschwindigkeit“ haben.

[
    {
        "Event_ID": 54::VARIANT,
        "Type": "Earthquake"::VARIANT,
        "Magnitude": 7.4::VARIANT,
        "Timestamp": "2018-06-09 12:32:15"::TIMESTAMP_LTZ::VARIANT
        ...
    }::VARIANT,
    {
        "Event_ID": 55::VARIANT,
        "Type": "Tornado"::VARIANT,
        "Maximum_wind_speed": 186::VARIANT,
        "Timestamp": "2018-07-01 09:42:55"::TIMESTAMP_LTZ::VARIANT
        ...
    }::VARIANT
]
Copy

Sie können Datenhierarchien von fast beliebiger Tiefe und Breite erstellen (bis zur Grenze des Speicherplatzes für jeden Datentyp). Ein OBJECT, das Informationen über einen Tornado enthält, könnte zum Beispiel Informationen über die Windgeschwindigkeit zu verschiedenen Zeiten während des Tornados benötigen, sodass Ihre Datenstruktur wie folgt aussehen könnte:

  1. Die oberste Ebene ist ein ARRAY.

  2. Jede Zelle dieses ARRAY enthält ein OBJECT, das einen Tornado beschreibt.

  3. Jedes OBJECT enthält ein ARRAY mit Windgeschwindigkeitsdaten.

  4. Jede Zelle dieses inneren ARRAY ist ein OBJECT, das Daten mit Schlüsseln wie den folgenden enthält:

    • Zeitstempel der Windgeschwindigkeit

    • Ort der Windgeschwindigkeit

    • Windgeschwindigkeit in km/h (Kilometer pro Stunde).

    In einigen Fällen können die Daten unvollständig sein. Wenn beispielsweise die Windgeschwindigkeit an einem bestimmten Ort auf der Grundlage der nach dem Tornado sichtbaren Schäden geschätzt (und nicht direkt während des Tornados gemessen) wurde, könnten die Daten zwar den Ort und die Windgeschwindigkeit, nicht aber einen Zeitstempel enthalten.

Laden von semistrukturierten Daten

Snowflake kann semistrukturierte Daten aus den Formaten JSON, Avro, ORC, Parquet und XML importieren und sie in Snowflake-Datentypen speichern, die speziell für die Unterstützung semistrukturierter Daten entwickelt wurden.

Je nach der Struktur der Daten, der Größe der Daten und der Art und Weise, wie der Benutzer die Daten importiert, kann die Speicherung semistrukturierter Daten in einer einzigen Spalte oder in mehrere Spalten aufgeteilt erfolgen.

Die Schritte zum Laden semistrukturierter Daten in Tabellen sind denen zum Laden strukturierter Daten in Tabellen ähnlich. Beim Laden und Speichern semistrukturierter Daten können Sie jedoch auch explizit alle, einige oder keine der Strukturen angeben:

  • Handelt es sich bei Ihren Daten um eine Menge von Schlüssel-Wert-Paaren, können Sie diese in eine Spalte vom Typ OBJECT laden.

  • Wenn Ihre Daten ein Array sind, können Sie diese in eine Spalte vom Typ ARRAY laden.

  • Wenn Sie Was sind hierarchische Daten? haben, können Sie eine der folgenden Möglichkeiten nutzen:

    • Teilen Sie die Daten auf mehrere Spalten auf. Folgende Aufgaben können ausgeführt werden:

      • Explizites Extrahieren und Transformieren von Spalten mit semistrukturierten Daten in separate Spalten von Zieltabellen

      • Verwenden von Snowflake zum automatischen Erkennen und Abrufen der Spaltendefinitionen von Dateien mit semistrukturierten Daten in Stagingbereichen. Erstellen Sie mit den Spaltendefinitionen Snowflake-Tabellen, externe Tabellen oder Ansichten. Um Zeit zu sparen, erstellen Sie Tabellen mit den automatisch aus den Stagingdateien abgerufenen Spaltendefinitionen.

        Bemerkung

        • Dieses Feature zum Erkennen und Abrufen unterstützt Apache Parquet-, Apache Avro-, ORC-, JSON- und CSV-Dateien. Die Unterstützung für CSV- und JSON-Dateien befindet sich derzeit in der Vorschau.

    • Speichern Sie die Daten in einer einzigen Spalte vom Typ VARIANT. Folgende Aufgaben können ausgeführt werden:

      • Explizites Angeben der Struktur (z. B. eine Hierarchie von VARIANT-, ARRAY- und OBJECT-Datentypen).

      • Laden der Daten ohne explizite Angabe der Struktur. Wenn Sie ein Datenformat angeben, das Snowflake erkennt und parst (JSON, Avro, Parquet oder ORC), werden die Daten in ein internes Datenformat konvertiert, das die Snowflake-Datentypen VARIANT, ARRAY und OBJECT verwendet.

Wenn die Daten komplex sind oder ein einzelner Wert mehr als etwa 16 MB Speicherplatz benötigt, können Sie mehr als eine der vorhergehenden Techniken verwenden. Beispielsweise können Sie die Daten in mehrere Spalten aufteilen, wobei einige dieser Spalten eine explizit festgelegte Hierarchie von Datentypen enthalten können.

Sie können semistrukturierte Daten auf folgende Weise laden:

  • Geben Sie beim Erstellen der Tabelle und beim Laden der Daten das Eingabedatenformat und den Snowflake-Datentyp an. Im folgenden Code wird beispielsweise in der CREATE TABLE-Anweisung der Datentyp VARIANT angegeben, während das JSON-Eingabedatenformat in der TYPE = <Datenformat>-Klausel des Befehls COPY INTO <Tabelle> angegeben wird:

    CREATE TABLE my_table (my_variant_column VARIANT);
    COPY INTO my_table ... FILE FORMAT = (TYPE = 'JSON') ...
    
    Copy
  • Geben Sie das Eingabedatenformat und den Snowflake-Datentyp an, indem Sie eine entsprechende Funktion zum Konvertieren der Daten aufrufen. Um zum Beispiel JSON-formatierte Daten in einen VARIANT-Wert zu konvertieren, rufen Sie PARSE_JSON wie folgt auf:

    INSERT INTO my_table (my_variant_column) SELECT PARSE_JSON('{...}');
    
    Copy

Wenn Daten in der Datentypen ARRAY, OBJECT oder VARIANT oder einer Hierarchie dieser Typen gespeichert sind, können Sie diese abfragen.

Speichern von semistrukturierten Daten

Semistrukturierte Daten werden in der Regel in den folgenden Snowflake-Datentypen gespeichert:

  • ARRAY: Ähnlich wie ein Array in anderen Sprachen.

  • OBJECT: Ähnlich wie ein JSON-Objekt, das in vielen Sprachen auch als „Wörterbuch“, „Hash“ oder „Map“ bezeichnet wird. Es enthält Schlüssel-Wert-Paare.

  • VARIANT: Datentyp, der einen Wert eines beliebigen anderen Datentyps enthalten kann (einschließlich ARRAY und OBJECT). VARIANT wird zum Erstellen und Speichern von hierarchischen Daten verwendet.

(Wenn die importierten Daten vor dem Speichern in mehrere Spalten aufgeteilt werden, können einige oder alle diese Spalten einfache Datentypen sein, z. B. FLOAT, VARCHAR)

Die Datentypen ARRAY, OBJECT und VARIANT können einzeln verwendet oder zur Bildung einer Hierarchie verschachtelt werden.

Wenn die Daten im JSON-, Avro-, ORC- oder Parquet-Format importiert werden, kann Snowflake die Hierarchie für Sie erstellen und diese in einem VARIANT speichern. Sie können eine Hierarchie auch manuell erstellen.

Unabhängig davon, wie die Hierarchie erstellt wurde, konvertiert Snowflake die Daten in ein optimiertes internes Speicherformat, das ARRAY, OBJECT und VARIANT verwendet. Dieses interne Speicherformat unterstützt schnelle und effiziente SQL-Abfragen.

Weitere Informationen zu den Datentypen ARRAY, OBJECT und VARIANT finden Sie unter Semistrukturierte Datentypen.

Abfragen von semistrukturierten Daten

Snowflake unterstützt Operatoren für folgende Aktionen:

Weitere Informationen zum Abfragen von semistrukturierten Daten finden Sie unter Abfragen von semistrukturierten Daten.

Informationen zum Abfragen von XML durch Angabe von XML-Tags finden Sie in der Dokumentation zur Funktion XMLGET.