Tabellenschemaentwicklung

Semistrukturierte Daten neigen dazu, sich im Laufe der Zeit weiterzuentwickeln. Systeme, die Daten generieren, fügen neue Spalten hinzu, um zusätzliche Informationen unterzubringen, sodass sich die nachgelagerten Tabellen entsprechend weiterentwickeln müssen.

Die Struktur der Tabellen in Snowflake kann sich automatisch weiterentwickeln, um die Struktur neuer Daten zu unterstützen, die von den Datenquellen empfangen werden. Snowflake unterstützt Folgendes:

  • Automatisches Hinzufügen neuer Spalten

  • Automatisches Löschen der NOT-NULL-Einschränkung von Spalten, die in neuen Datendateien fehlen

Um die Tabellenschemaentwicklung zu aktivieren, gehen Sie wie folgt vor:

  • Wenn Sie eine neue Tabelle erstellen und dabei den Befehl CREATE TABLE verwenden, setzen Sie den Parameter ENABLE_SCHEMA_EVOLUTION auf TRUE.

  • Bei einer bestehenden Tabelle ändern Sie die Tabelle mit dem Befehl ALTER TABLE und setzen den Parameter ENABLE_SCHEMA_EVOLUTION auf TRUE.

Beim Laden von Daten aus Dateien erfolgt eine Tabellenspaltenentwicklung, wenn die folgenden Bedingungen erfüllt sind:

  • Die COPY INTO <Tabelle>-Anweisung enthält den Parameter MATCH_BY_COLUMN_NAME.

  • Die Rolle, mit der die Daten geladen werden, hat die EVOLVE SCHEMA- oder die OWNERSHIP-Berechtigung für die Tabelle.

Außerdem muss für die Schemaentwicklung mit CSV bei Verwendung von MATCH_BY_COLUMN_NAME und PARSE_HEADER der Parameter ERROR_ON_COLUMN_COUNT_MISMATCH auf „false“ gesetzt sein.

Die Schemaentwicklung ist ein eigenständiges Feature, kann aber zusammen mit der Unterstützung für das Abrufen von Spaltendefinitionen für eine Menge von Dateien des Cloudspeicher verwendet werden. In Kombination ermöglichen diese Features kontinuierliche Datenpipelines, indem neue Tabellen aus einer Menge von Datendateien in einem Cloudspeicher erstellt und dann Spalten der Tabellen geändert werden, wenn sich das Schema der neuen Quelldatendateien durch Hinzufügen oder Löschen von Spalten weiterentwickelt.

Nutzungshinweise

  • Diese Feature unterstützt Apache Avro-, Apache Parquet-, CSV-, JSON- und ORC-Dateien.

  • Dieses Feature ist auf COPY INTO <Tabelle>-Anweisungen und das Laden von Daten mit Snowpipe beschränkt. INSERT-Operationen können das Schema der Zieltabelle nicht automatisch weiterentwickeln.

  • Das Laden von Daten mit Snowpipe Streaming wird bei der Schemaentwicklung nicht unterstützt.

  • Standardmäßig ist dieses Feature darauf beschränkt, maximal 10 Spalten hinzuzufügen oder nicht mehr als 1 Schema pro COPY-Operation weiterzuentwickeln. Wenn Sie mehr als 10 hinzugefügte Spalten oder 1 Schema pro COPY-Operation anfordern möchten, wenden Sie sich an den Snowflake-Support.

  • Es gibt keine Beschränkung für das Löschen von NOT NULL-Spalteneinschränkungen.

Beispiele

Das folgende Beispiel erstellt eine Tabelle mit Spaltendefinitionen, die aus einer Menge von Parquet-Daten abgeleitet werden. Wenn die automatische Tabellenschemaentwicklung für die Tabelle aktiviert ist, werden beim Laden von Daten aus Parquet-Dateien, die zusätzliche Name/Wert-Paare enthalten, automatisch Spalten zur Tabelle hinzugefügt:

Beachten Sie, dass der Stagingbereich mystage und das Dateiformat my_parquet_format, auf die in der Anweisung verwiesen wird, bereits vorhanden sein müssen. Ein Satz von Dateien muss bereits in dem Stagingbereich an dem Cloudspeicherort bereitgestellt sein, auf den in der Stagingbereichsdefinition verwiesen wird.

Das folgende Beispiel baut auf einem Beispiel aus dem Thema INFER_SCHEMA auf:

-- Create table t1 in schema d1.s1, with the column definitions derived from the staged file1.parquet file.
USE SCHEMA d1.s1;

CREATE OR REPLACE TABLE t1
  USING TEMPLATE (
    SELECT ARRAY_AGG(object_construct(*))
      FROM TABLE(
        INFER_SCHEMA(
          LOCATION=>'@mystage/file1.parquet',
          FILE_FORMAT=>'my_parquet_format'
        )
      ));

-- Row data in file1.parquet.
+------+------+------+
| COL1 | COL2 | COL3 |
|------+------+------|
| a    | b    | c    |
+------+------+------+

-- Describe the table.
-- Note that column c2 is required in the Parquet file metadata. Therefore, the NOT NULL constraint is set for the column.
DESCRIBE TABLE t1;
+------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
| name | type              | kind   | null? | default | primary key | unique key | check | expression | comment | policy name |
|------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------|
| COL1 | VARCHAR(16777216) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
| COL2 | VARCHAR(16777216) | COLUMN | N     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
| COL3 | VARCHAR(16777216) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
+------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+

-- Use the SECURITYADMIN role or another role that has the global MANAGE GRANTS privilege.
-- Grant the EVOLVE SCHEMA privilege to any other roles that could insert data and evolve table schema in addition to the table owner.

GRANT EVOLVE SCHEMA ON TABLE d1.s1.t1 TO ROLE r1;

-- Enable schema evolution on the table.
-- Note that the ENABLE_SCHEMA_EVOLUTION property can also be set at table creation with CREATE OR REPLACE TABLE
ALTER TABLE t1 SET ENABLE_SCHEMA_EVOLUTION = TRUE;

-- Load a new set of data into the table.
-- The new data drops the NOT NULL constraint on the col2 column.
-- The new data adds the new column col4.
COPY INTO t1
  FROM @mystage/file2.parquet
  FILE_FORMAT = (type=parquet)
  MATCH_BY_COLUMN_NAME = CASE_INSENSITIVE;

-- Row data in file2.parquet.
+------+------+------+
| col1 | COL3 | COL4 |
|------+------+------|
| d    | e    | f    |
+------+------+------+

-- Describe the table.
DESCRIBE TABLE t1;
+------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
| name | type              | kind   | null? | default | primary key | unique key | check | expression | comment | policy name |
|------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------|
| COL1 | VARCHAR(16777216) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
| COL2 | VARCHAR(16777216) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
| COL3 | VARCHAR(16777216) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
| COL4 | VARCHAR(16777216) | COLUMN | Y     | NULL    | N           | N          | NULL  | NULL       | NULL    | NULL        |
+------+-------------------+--------+-------+---------+-------------+------------+-------+------------+---------+-------------+
-- Note that since MATCH_BY_COLUMN_NAME is set as CASE_INSENSITIVE, all column names are retrieved as uppercase letters.
Copy