Schemaverwaltung

Diese ausführliche Analyse erklärt, wie Zerobus Ingest in Lakeflow Connect eingehende Datensätze anhand Ihres Delta-Tabellenschemas validiert und wie Sie Ihr Schema für teilweise oder sich entwickelnde Daten entwerfen können.

Viele Produzenten schreiben in dieselbe Delta-Tabelle, und Zerobus Ingest validiert jeden Datensatz anhand des einzigen festen Tabellenschemas: Ein Datensatz wird als Ganzes akzeptiert oder abgelehnt, und nicht-konforme Felder werden in einer Rettungs-VARIANT-Spalte erfasst, wenn eines konfiguriert ist

Die Tabelle ist der Vertrag

Dein Delta-Tabellenschema ist der autoritative Vertrag für das, was Zerobus Ingest akzeptiert. Zerobus Ingest blockiert jeden Datensatz gegen diesen Vertrag, aber Sie entscheiden, wie streng oder wie tolerant der Vertrag ist. Der gleiche Dienst kann ein starres Schema erzwingen, eine flexible Teilmenge von Spalten akzeptieren oder alles erfassen, was nicht passt, je nachdem, wie du deine Tabelle definiert.

  • Zerobus Ingest sperrt die Daten. Es validiert jeden Datensatz gegen die Zieltabelle und lehnt alles ab, was nicht passt. Es rät nie und lässt Spalten nie im Hintergrund aus.
  • Du definierst den Vertrag. Indem Sie Spalten als erforderlich oder keine Nullwerte zulassend kennzeichnen und eine Ausweichspalte hinzufügen, entscheiden Sie, was „passt“.
  • Zerobus Ingest ergänzt Ihre Tabelle niemals. Es fügt keine Spalten hinzu, ändert keine Typen und entwickelt das Schema nicht weiter, um einen Datensatz aufzunehmen. Man entwickelt das, was Zerobus Ingest akzeptiert, indem man die Tabelle weiterentwickelt, nicht umgekehrt.

Der nächste Abschnitt zeigt drei Möglichkeiten, diesen Vertrag zu gestalten: von der tolerantesten über die strengste bis hin zur Catch-all-Variante.

Wie Rekorde mit der Tabelle abgeglichen werden

Ein Datensatz muss in die Zieltabelle passen: Er muss mindestens alle nicht nullbaren Spalten in der Tabelle enthalten. Spalten, die in der Tabelle nullierbar sind, können aus dem Datensatz weggelassen werden und werden als NULLgeschrieben. Das Weglassen einer NULL-fähigen Spalte wird als nicht kompatibilitätsbrechende Änderung behandelt, sodass du einer Tabelle NULL-fähige Spalten hinzufügen und weiterhin ältere Datensätze verarbeiten kannst, die diese Spalten nicht enthalten.

Zerobus Ingest liefert einen Fehler, wenn ein Datensatz nicht in die Tabelle passt. Dazu gehören:

  • Eine fehlende Spalte, die keine NULL-Werte zulässt.
  • Ein Spaltenname, der in der Delta-Tabelle nicht existiert (es sei denn, man konfiguriert eine Rettungsspalte).
  • Eine Spalte, deren Typ nicht mit der Delta-Tabelle kompatibel ist. Für die unterstützten Delta- und Protobuf-Datentypen siehe Unterstützte Datentypen.

Drei Möglichkeiten, den Vertrag zu gestalten

Wie Sie die Tabelle definieren, bestimmt, wie streng oder tolerant die Erfassung ist. Die drei folgenden Szenarien reichen von „am tolerantesten” über „streng” bis hin zu „alles erfassen”.

Szenario 1: Alle Spalten optional (akzeptieren Sie eine Teilmenge)

Mach jede Spalte null. Produzenten können dann jede beliebige Teilmenge der Spalten senden, und ausgelassene Spalten werden als NULLgeschrieben. Datensätze, die eine Spalte enthalten, die die Tabelle nicht enthält, werden weiterhin abgelehnt.

CREATE TABLE main.default.air_quality (
  device_name STRING,
  temp INT,
  humidity INT);
  • {"device_name": "sensor-1", "temp": 22, "humidity": 55}: akzeptiert. Alle Spalten vorhanden.
  • {"device_name": "sensor-1"}: Akzeptiert.temp und humidity nullierbar sind, daher werden sie als NULLgeschrieben.
  • {"device_name": "sensor-1", "temp": 22, "region": "us-west"}: abgelehnt.region existiert nicht in der Tabelle.

Szenario 2: Erforderliche Spalten (bestimmte Felder erzwingen)

Markiere Spalten NOT NULL , um sie zu verlangen. Jeder Datensatz muss diese Spalten enthalten, sonst wird er abgelehnt. Das ist das strikte Ende des Spektrums: Nutzen Sie es, wenn ein Feld immer vorhanden sein muss.

CREATE TABLE main.default.air_quality (
  device_name STRING NOT NULL,
  temp INT NOT NULL,
  humidity INT);
  • {"device_name": "sensor-1", "temp": 22, "humidity": 55}: Akzeptiert. Alle erforderlichen Spalten sind vorhanden.
  • {"device_name": "sensor-1", "temp": 22}: Akzeptiert.humidity nullierbar ist, daher wird es geschrieben als NULL.
  • {"device_name": "sensor-1"}: abgelehnt.temp lässt keine Nullwerte zu und fehlt.

Szenario 3: Rettungsspalte (alles andere erfassen)

Füge eine VARIANT Rettungsspalte hinzu, um Felder zu erfassen, die nicht ins Schema passen, anstatt den Datensatz abzulehnen. Felder, die mit der Tabelle übereinstimmen, werden wie üblich in ihre Spalten geschrieben. Alle zusätzlichen oder nicht konformen Felder werden als JSON-Objekt in die Rettungsspalte gruppiert. Dies ist das toleranteste Ende des Spektrums: Zusätzliche Felder und Nichtübereinstimmungen mit Spalten, die Nullwerte zulassen, werden erfasst, anstatt abgelehnt zu werden. Ein Datensatz wird weiterhin abgelehnt, wenn eine erforderliche (nicht-nullfähige) Spalte fehlt, da die Rescue-Spalte keinen Wert liefern kann, den das Schema erfordert. Die Wiederherstellungsspalte ist derzeit in der Betaphase und unterstützt die Aufnahme von Daten im JSON-Format.

  • {"device_name": "sensor-1", "temp": 22, "region": "us-west"}: Akzeptiert.region existiert nicht in der Tabelle, daher wird es in der Auffangspalte erfasst, statt zurückgewiesen zu werden.

Für die Konfiguration einer Rettungsspalte und die genauen Regeln siehe Zerobus-Rettungsspalte.

Schemaentwicklung

Zerobus Ingest entwickelt Ihre Zieltabelle nicht automatisch weiter. Wenn sich deine Datenform ändert, entwickle zuerst die Tabelle (zum Beispiel mit ALTER TABLE), und sende dann Datensätze gegen das neue Schema.

Das Hinzufügen einer Spalte, die Nullwerte zulässt, ist ein Non-Breaking Change: Bestehende Producer, die die neue Spalte nicht senden, funktionieren weiterhin, und ihre Datensätze erhalten dafür NULL. So kannst du Schemaänderungen und Produzentenänderungen unabhängig voneinander ausrollen.

Protobuf-Schema

Wenn Sie mit Protocol Buffers (Protobuf) erfassen, gilt die gleiche Regel für das, was passt, für ihre Protobuf-Nachrichtendefinition: Sie muss mindestens alle Spalten, die keine Nullwerte zulassen, in der Delta-Tabelle enthalten und kann Spalten, die Nullwerte zulassen, weglassen.

Folgende gelten auch für das Protobuf-Schema:

  • Zerobus Ingest unterstützt keine Proto-Schemata mit mehr als 2000 Spalten.
  • Zerobus Ingest unterstützt nur Tabellen- und Spaltennamen mit ASCII-Buchstaben, Ziffern und Unterstrichen.
  • Zerobus Ingest unterstützt nicht die Verwendung eines anderen Proto-Schemas für die "Stream-Erstellung" und "Ingest Record"-Operationen.