Tutorial: Erstellen Sie Ihre erste Apache Iceberg™-Tabelle

Einführung

In diesem Tutorial erfahren Sie, wie Sie Apache Iceberg™-Tabellen erstellen, die Snowflake als Katalog verwendet und Lese- und Schreiboperationen unterstützen. Iceberg-Tabellen für Snowflake kombinieren die Leistung und Abfragesemantik regulärer Snowflake-Tabellen mit dem von Ihnen verwalteten externen Cloudspeicher.

Führen Sie dieses Tutorial mit einem Arbeitsblatt in Snowsight oder mit einem Snowflake-Client wie SnowSQL durch. Sie können die Codebeispiele kopieren und einfügen und sie dann ausführen.

Lerninhalte

In diesem Tutorial lernen Sie Folgendes:

  • Eine externes Volume für Snowflake-verwaltete Iceberg-Tabellen erstellen und konfigurieren. Zu Demonstrationszwecken erstellt das Tutorial ein externes Volume für Amazon S3.

  • Erstellen Sie zwei Iceberg-Tabellen, die Snowflake als Iceberg-Katalog verwenden (Snowflake-verwaltete Tabellen).

  • Daten in die Iceberg-Tabellen einfügen.

  • Iceberg-Tabellen abfragen.

  • Löschen Sie Zeilen aus einer Iceberg-Tabelle.

Voraussetzungen

Bevor Sie beginnen, sollten Sie mit den folgenden Punkten vertraut sein:

Sie benötigen:

  • Snowflake-Benutzer mit einer Rolle, die die Berechtigungen hat, die folgenden Aktionen auszuführen:

    Bei Verwendung eines 30-Tage-Testkontos können Sie sich als der Benutzer anmelden, der für das Konto erstellt wurde. Dieser Benutzer hat die Rolle mit den Berechtigungen, die zum Erstellen der Objekte erforderlich sind.

    Wenn Sie keinen Benutzer mit den erforderlichen Berechtigungen haben, bitten Sie jemanden, der über die erforderlichen Berechtigungen verfügt, einen Benutzer für Sie zu erstellen. Benutzer mit der Rolle ACCOUNTADMIN können neue Benutzer erstellen und ihnen die erforderlichen Berechtigungen erteilen.

  • Administrator-Zugriff für Ihren Cloudspeicher-Anbieter, um ein externes Volume zu konfigurieren.

  • Speicher-Bucket (oder Container) bei demselben Cloudanbieter (in derselben Region), der Ihr Snowflake-Konto hostet.

  • Zugriff auf die Datenbank SNOWFLAKE_SAMPLE_DATA in Ihrem Konto. Snowflake erstellt die Beispieldatenbank standardmäßig in neuen Konten. Wenn die Datenbank nicht in Ihrem Konto erstellt wurde, finden Sie weitere Informationen unter Verwenden der Beispieldatenbank.

Ein Warehouse und eine Datenbank einrichten

Richten Sie Ihre Umgebung ein, indem Sie ein Warehouse und eine Datenbank für dieses Tutorial erstellen.

CREATE WAREHOUSE iceberg_tutorial_wh
  WAREHOUSE_TYPE = STANDARD
  WAREHOUSE_SIZE = XSMALL;

USE WAREHOUSE iceberg_tutorial_wh;

CREATE OR REPLACE DATABASE iceberg_tutorial_db;
USE DATABASE iceberg_tutorial_db;
Copy

Externes Volume erstellen

Bevor Sie eine Apache Iceberg™-Tabelle für Snowflake erstellen können, müssen Sie über ein externes Volume verfügen. Ein externes Volume ist ein benanntes Snowflake-Objekt auf Kontoebene, das eine Identitäts- und Zugriffsverwaltungsentität (IAM) für Ihren externen Cloudspeicher speichert.

Snowflake verwendet das externe Volume, um eine sichere Verbindung zu Ihrem Cloudspeicher herzustellen und auf Tabellendaten und Metadaten zuzugreifen.

Zu Demonstrationszwecken wird in diesem Schritt beschrieben, wie Sie ein externes Volume für Amazon S3 erstellen. Um ein externes Volume für einen anderen Cloudspeicherdienst zu erstellen, finden Sie weitere Informationen unter:

IAM-Richtlinie erstellen, die Zugriff auf den S3-Speicherort gewährt

Um die Zugriffsberechtigungen für Snowflake in der AWS-Managementkonsole zu konfigurieren, gehen Sie wie folgt vor:

  1. Melden Sie sich bei der AWS Management Console an.

  2. Suchen Sie auf dem Home-Dashboard nach IAM, und wählen Sie es aus.

  3. Wählen Sie im linken Navigationsbereich Account settings aus.

  4. Unter Security Token Service (STS) in der Liste Endpoints finden Sie die Snowflake-Region, in der sich Ihr Konto befindet. Wenn STS status inaktiv ist, stellen Sie den Umschalter auf Active.

  5. Wählen Sie im linken Navigationsbereich Policies aus.

  6. Wählen Sie Create Policy aus.

    Erstellen Sie in der AWS-Managementkonsole eine IAM-Richtlinie.
  7. Wählen Sie unter Policy editor die Option JSON aus.

  8. Fügen Sie eine Richtlinie hinzu, um Snowflake mit den erforderlichen Berechtigungen zum Lesen und Schreiben von Daten an Ihrem S3-Speicherort auszustatten.

    Die folgende Beispielrichtlinie gewährt Zugriff auf alle Speicherorte im angegebenen Bucket.

    Bemerkung

    • Ersetzen Sie my_bucket durch den tatsächlichen Namen Ihres Buckets. Sie können auch einen Pfad im Bucket angeben, zum Beispiel my_bucket/path.

    • Wenn Sie die Bedingung "s3:prefix": auf ["*"] setzen, erhalten Sie Zugriff auf alle Präfixe im angegebenen Bucket, und wenn Sie die Bedingung auf ["path/*"] setzen, erhalten Sie Zugriff auf einen bestimmten Pfad im Bucket.

    • Für Buckets in Regionen für Regierungsbehörden wird für die Bucket-ARNs das Präfix arn:aws-us-gov:s3::: verwendet.

    {
       "Version": "2012-10-17",
       "Statement": [
             {
                "Effect": "Allow",
                "Action": [
                   "s3:PutObject",
                   "s3:GetObject",
                   "s3:GetObjectVersion",
                   "s3:DeleteObject",
                   "s3:DeleteObjectVersion"
                ],
                "Resource": "arn:aws:s3:::<my_bucket>/*"
             },
             {
                "Effect": "Allow",
                "Action": [
                   "s3:ListBucket",
                   "s3:GetBucketLocation"
                ],
                "Resource": "arn:aws:s3:::<my_bucket>",
                "Condition": {
                   "StringLike": {
                         "s3:prefix": [
                            "*"
                         ]
                   }
                }
             }
       ]
    }
    
    Copy
  9. Wählen Sie Next aus.

  10. Geben Sie unter Policy name den Namen der Richtlinie (z. B. snowflake_access) und unter Description eine optionale Beschreibung ein.

  11. Wählen Sie Create policy aus.

-IAM Rolle erstellen

Erstellen Sie eine AWS-IAM-Rolle, um Berechtigungen für den S3-Bucket mit Ihren Datendateien zu vergeben.

  1. Wählen Sie im linken Navigationsbereich des Identity and Access Management (IAM)-Dashboards die Option Roles aus.

  2. Wählen Sie Create role aus.

  3. Wählen Sie für den Typ der vertrauenswürdigen Entität AWS account.

  4. Wählen Sie unter An AWS account die Option This account aus. In einem späteren Schritt ändern Sie die Vertrauensstellung und gewähren Snowflake Zugriff.

  5. Wählen Sie die Option Require external ID aus. Geben Sie eine externe ID Ihrer Wahl ein. Beispiel: iceberg_table_external_id.

    Eine externe ID wird verwendet, um einer dritten Partei wie Snowflake Zugriff auf Ihre AWS-Ressourcen (wie S3-Buckets) zu gewähren.

    Erstellen Sie eine IAM-Rolle mit einer externen ID.
  6. Wählen Sie Next aus.

  7. Wählen Sie die Richtlinie, die Sie für das externe Volume erstellt haben, und wählen Sie dann Next.

  8. Geben Sie unter Role name einen Namen und eine Beschreibung für die Rolle ein, und wählen Sie zum Erstellen Create role aus.

    Sie haben nun eine IAM-Richtlinie für einen S3-Speicherort erstellt, eine IAM-Rolle erstellt und die Richtlinie an die Rolle angehängt.

  9. Wählen Sie View role, um die Rollenübersichtsseite anzuzeigen. Suchen Sie den ARN (Amazon Resource Name) für die Rolle, und notieren Sie sich den Wert.

    Banner mit Link zur Ansicht der neuen Rolle IAM.

Externes Volume in Snowflake erstellen

Erstellen Sie mit dem Befehl CREATE EXTERNAL VOLUME ein externes Volume. Im folgenden Beispiel wird ein externes Volume namens iceberg_external_volume erstellt, das einen Amazon S3-Speicherort mit Verschlüsselung definiert:

CREATE OR REPLACE EXTERNAL VOLUME iceberg_external_volume
   STORAGE_LOCATIONS =
      (
         (
            NAME = 'my-s3-us-west-2'
            STORAGE_PROVIDER = 'S3'
            STORAGE_BASE_URL = 's3://<my_bucket>/'
            STORAGE_AWS_ROLE_ARN = '<arn:aws:iam::123456789012:role/myrole>'
            STORAGE_AWS_EXTERNAL_ID = 'iceberg_table_external_id'
         )
      );
Copy

Das Beispiel gibt die externe ID (iceberg_table_external_id) an, die mit der IAM-Rolle verbunden ist, die Sie für das externe Volume erstellt haben. Durch das Angeben einer externen ID können Sie dieselbe IAM-Rolle (und externe ID) für mehrere externe Volumes verwenden.

Bemerkung

Geben Sie ARNs genau so an, wie von AWS bereitgestellt. Bei ARNs wird die Groß-/Kleinschreibung unterschieden.

AWS-IAM-Benutzer für Ihr Snowflake-Konto abrufen

  1. Um den ARN für den AWS-IAM-Benutzer abzurufen, der automatisch für Ihr Snowflake-Konto erstellt wurde, verwenden Sie den Befehl DESCRIBE EXTERNAL VOLUME. Geben Sie den Namen Ihres externen Volumes an.

    Im folgenden Beispiel wird ein externes Volume namens iceberg_external_volume beschrieben:

    DESC EXTERNAL VOLUME iceberg_external_volume;
    
    Copy
  2. Notieren Sie sich den Wert der Eigenschaft STORAGE_AWS_IAM_USER_ARN, der dem für Ihr Snowflake-Konto erstellten AWS-IAM-Benutzer entspricht, z. B. arn:aws:iam::123456789001:user/abc1-b-self1234.

    Snowflake stellt genau einen IAM-Benutzer für Ihr gesamtes Snowflake-Konto bereit. Dieser IAM-Benutzer wird von allen externen S3-Volumes in Ihrem Konto verwendet.

    Bemerkung

    Wenn Sie beim Erstellen eines externen Volumes keine externe ID (STORAGE_AWS_EXTERNAL_ID) angegeben haben, generiert Snowflake eine ID, die Sie verwenden können. Notieren Sie sich den Wert, damit Sie Ihre IAM-Rollen-Vertrauensrichtlinie mit der generierten externen ID aktualisieren können.

IAM-Benutzerberechtigungen für den Zugriff auf Bucket-Objekte erteilen

In diesem Schritt konfigurieren Sie Berechtigungen, die dem IAM-Benutzer Ihres Snowflake-Kontos den Zugriff auf Objekte in Ihrem S3-Bucket ermöglichen.

  1. Melden Sie sich bei der AWS Management Console an.

  2. Suchen Sie auf dem Home-Dashboard nach IAM, und wählen Sie es aus.

  3. Wählen Sie im linken Navigationsbereich Roles aus.

  4. Wählen Sie die IAM-Rolle aus, die Sie für Ihr externes Volume erstellt haben.

  5. Wählen Sie die Registerkarte Trust relationships aus.

  6. Wählen Sie Edit trust policy aus.

  7. Ändern Sie das Richtliniendokument mit den DESC EXTERNAL VOLUME-Ausgabewerten, die Sie sich notiert haben.

    Aktualisieren Sie die Vertrauensrichtlinie für die IAM-Rolle.

    Richtliniendokument für die IAM-Rolle

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "",
          "Effect": "Allow",
          "Principal": {
            "AWS": "<snowflake_user_arn>"
          },
          "Action": "sts:AssumeRole",
          "Condition": {
            "StringEquals": {
              "sts:ExternalId": "<iceberg_table_external_id>"
            }
          }
        }
      ]
    }
    
    Copy

    Wobei:

    • snowflake_user_arn ist der von Ihnen notierte STORAGE_AWS_IAM_USER_ARN-Wert.

    • iceberg_table_external_id ist Ihre externe ID. Wenn Sie bereits beim Erstellen der Rolle eine externe ID angegeben haben und dieselbe ID zum Erstellen Ihres externen Volumes verwendet haben, lassen Sie den Wert unverändert. Andernfalls aktualisieren Sie sts:ExternalId mit dem Wert, den Sie sich notiert haben.

    Bemerkung

    Sie müssen dieses Richtliniendokument aktualisieren, wenn Sie ein neues externes Volume erstellen (oder ein vorhandenes externes Volume mit der CREATE OR REPLACE EXTERNAL VOLUME-Syntax erneut erstellen) und keine eigene externe ID bereitstellen. Aus Sicherheitsgründen hat ein neues oder neu erstelltes externes Volume eine andere externe ID und kann die Vertrauensstellung nur auflösen, wenn Sie diese Vertrauensrichtlinie aktualisieren.

  8. Wählen Sie Update policy aus, um Ihre Änderungen zu speichern.

Tabelle erstellen

In diesem Schritt erstellen Sie zwei Apache Iceberg™-Tabellen: eine mit der Standardsyntax CREATE ICEBERG TABLE und eine mit der Variante CREATE ICEBERG TABLE … AS SELECT. Beide Tabellen verwenden das im vorherigen Schritt konfigurierte externe Volume.

Sie erfahren auch, wie Sie den Iceberg-Katalog und das externe Volume auf Datenbankebene einstellen.

Erstellen Sie eine Tabelle mit der Standardsyntax

Erstellen Sie zunächst eine Iceberg-Tabelle mit der Standard-Syntax CREATE ICEBERG TABLE.

Geben Sie CATALOG = 'SNOWFLAKE' an, damit die Tabelle Snowflake als Iceberg-Katalog verwendet.

Um Snowflake mitzuteilen, wohin Tabellendaten und Metadaten geschrieben werden sollen, geben Sie einen Wert für den Parameter BASE_LOCATION an. Das Beispiel legt den Tabellennamen (customer_iceberg) als BASE_LOCATION fest. Auf diese Weise schreibt Snowflake Daten und Metadaten in ein Verzeichnis, das denselben Namen wie die Tabelle am Speicherort des externen Volumes hat.

CREATE OR REPLACE ICEBERG TABLE customer_iceberg (
    c_custkey INTEGER,
    c_name STRING,
    c_address STRING,
    c_nationkey INTEGER,
    c_phone STRING,
    c_acctbal INTEGER,
    c_mktsegment STRING,
    c_comment STRING
)
    CATALOG = 'SNOWFLAKE'
    EXTERNAL_VOLUME = 'iceberg_external_volume'
    BASE_LOCATION = 'customer_iceberg';
Copy

Im weiteren Verlauf des Tutorials laden Sie Daten aus der Tabelle snowflake_sample_data.tpch_sf1.customer der Datenbank SNOWFLAKE_SAMPLE_DATA in diese Tabelle. Die Spaltendefinitionen in der CREATE ICEBERG TABLE-Anweisung stimmen mit der Beispieltabelle überein.

Bemerkung

Wenn Sie Ihren Cloudspeicherort überprüfen, sollten Sie jetzt ein Verzeichnis mit dem Namen metadata/ sehen, das Snowflake während der Tabellenerstellung unter BASE_LOCATION erstellt hat. In diesem Verzeichnis werden die Metadaten-Dateien für Ihre Tabelle gespeichert.

Legen Sie die Katalogintegration und das externe Volume für die Datenbank fest

Legen Sie als Nächstes die Parameter CATALOG und EXTERNAL_VOLUME für die Datenbank iceberg_tutorial_db fest, die Sie in diesem Tutorial erstellt haben. Durch das Einstellen der Parameter wird Snowflake angewiesen, den von Ihnen gewählten Katalog und das externe Volume für alle Iceberg-Tabellen zu verwenden, die nach der Änderung erstellt werden.

ALTER DATABASE iceberg_tutorial_db SET CATALOG = 'SNOWFLAKE';
ALTER DATABASE iceberg_tutorial_db SET EXTERNAL_VOLUME = 'iceberg_external_volume';
Copy

Überprüfen Sie dazu die Parameter für die aktuelle Datenbank (iceberg_tutorial_db):

SHOW PARAMETERS IN DATABASE ;
Copy

Erstellen Sie eine Tabelle mit CTAS

Erstellen Sie schließlich eine zweite Iceberg-Tabelle namens nation_iceberg unter Verwendung der CREATE ICEBERG TABLE … AS SELECT-Syntax. Als Grundlage für die neue Tabelle dient die Tabelle snowflake_sample_data.tpch_sf1.nation der Snowflake-Beispieldatenbank.

Bemerkung

Da Sie gerade die Parameter CATALOG und EXTERNAL_VOLUME für die Datenbank iceberg_tutorial_db festgelegt haben, können Sie beide Parameter in der CREATE ICEBERG TABLE-Anweisung weglassen. Die Tabelle nation_iceberg erbt die Werte von der Datenbank.

CREATE OR REPLACE ICEBERG TABLE nation_iceberg (
  n_nationkey INTEGER,
  n_name STRING
)
  BASE_LOCATION = 'nation_iceberg'
  AS SELECT
    N_NATIONKEY,
    N_NAME
  FROM snowflake_sample_data.tpch_sf1.nation;
Copy

Daten laden und Tabellen abfragen

In diesem Schritt beginnen Sie mit dem Laden von Daten aus der Snowflake-Beispieldatenbank in die Tabelle customer_iceberg mittels INSERT INTO <table>:

INSERT INTO customer_iceberg
  SELECT * FROM snowflake_sample_data.tpch_sf1.customer;
Copy

Bemerkung

Wenn Sie Ihren Cloudspeicherort überprüfen, sollten Sie nun ein Verzeichnis sehen, das Ihre Tabellendatendateien unter folgendem Pfad enthält: STORAGE_BASE_URL/BASE_LOCATION/customer_iceberg/data/.

Da nun Daten in der Tabelle vorhanden sind, können Sie die Tabelle abfragen. Die folgende Abfrage verknüpft die Tabelle customer_iceberg mit der Tabelle nation_iceberg (die bereits Daten enthält).

SELECT
    c.c_name AS customer_name,
    c.c_mktsegment AS market_segment,
    n.n_name AS nation
  FROM customer_iceberg c
  INNER JOIN nation_iceberg n
    ON c.c_nationkey = n.n_nationkey
  LIMIT 15;
Copy

Ausgabe:

+--------------------+----------------+----------------+
| CUSTOMER_NAME      | MARKET_SEGMENT | NATION         |
|--------------------+----------------+----------------|
| Customer#000015001 | HOUSEHOLD      | MOROCCO        |
| Customer#000015002 | BUILDING       | VIETNAM        |
| Customer#000015003 | BUILDING       | INDONESIA      |
| Customer#000015004 | FURNITURE      | SAUDI ARABIA   |
| Customer#000015005 | HOUSEHOLD      | KENYA          |
| Customer#000015006 | BUILDING       | UNITED KINGDOM |
| Customer#000015007 | MACHINERY      | FRANCE         |
| Customer#000015008 | HOUSEHOLD      | INDIA          |
| Customer#000015009 | FURNITURE      | EGYPT          |
| Customer#000015010 | HOUSEHOLD      | ETHIOPIA       |
| Customer#000015011 | FURNITURE      | UNITED KINGDOM |
| Customer#000015012 | BUILDING       | FRANCE         |
| Customer#000015013 | FURNITURE      | SAUDI ARABIA   |
| Customer#000015014 | HOUSEHOLD      | KENYA          |
| Customer#000015015 | MACHINERY      | ROMANIA        |
+--------------------+----------------+----------------+

Zeilen löschen

In diesem Schritt verwenden Sie eine DELETE-Anweisung, um bestimmte Zeilen aus der Tabelle customer_iceberg zu entfernen.

Beginnen Sie mit der Abfrage der ersten 10 Zeilen der Tabelle und stellen Sie fest, dass vier Zeilen zum Marktsegment AUTOMOBILE gehören:

SELECT
    c_name AS customer_name,
    c_mktsegment AS market_segment
  FROM customer_iceberg
  LIMIT 10;
Copy

Ausgabe:

+--------------------+----------------+
| CUSTOMER_NAME      | MARKET_SEGMENT |
|--------------------+----------------|
| Customer#000000001 | BUILDING       |
| Customer#000000002 | AUTOMOBILE     |
| Customer#000000003 | AUTOMOBILE     |
| Customer#000000004 | MACHINERY      |
| Customer#000000005 | HOUSEHOLD      |
| Customer#000000006 | AUTOMOBILE     |
| Customer#000000007 | AUTOMOBILE     |
| Customer#000000008 | BUILDING       |
| Customer#000000009 | FURNITURE      |
| Customer#000000010 | HOUSEHOLD      |
+--------------------+----------------+

Als Nächstes verwenden wir eine DELETE-Anweisung, um alle Zeilen aus der Tabelle zu entfernen, in denen das Marktsegment AUTOMOBILE lautet:

DELETE FROM customer_iceberg WHERE c_mktsegment = 'AUTOMOBILE';
Copy

Ausgabe:

+------------------------+
| number of rows deleted |
|------------------------|
|                  29752 |
+------------------------+

Schließlich können Sie noch einmal überprüfen, ob die Zeilen entfernt wurden:

SELECT
    c_name AS customer_name,
    c_mktsegment AS market_segment
 FROM customer_iceberg
 WHERE c_mktsegment = 'AUTOMOBILE';
Copy

Ausgabe:

+---------------+----------------+
| CUSTOMER_NAME | MARKET_SEGMENT |
|---------------+----------------|
+---------------+----------------+
0 Row(s) produced. Time Elapsed: 1.426s

Herzlichen Glückwunsch!

Sie haben gerade in Ihre ersten Snowflake-verwalteten Iceberg-Tabellen geschrieben, daraus gelesen und sie verändert. Sie haben auch gelernt, wie Sie ein externes Volume für die Speicherung von Iceberg-Tabellen konfigurieren und den Iceberg-Katalog und das externe Volume für alle Iceberg-Tabellen in einer Datenbank festlegen.

Bereinigen

Um alle für dieses Tutorial erstellten Objekte zu löschen, führen Sie die folgenden DROP-Anweisungen aus.

Ersetzen Sie die folgenden Werte:

  • my_other_database mit dem Namen der zu verwendenden Datenbank, sodass Sie die für dieses Tutorial erstellte Datenbank löschen können.

  • my_other_warehouse mit dem Namen des externen Volumes, das Sie erstellt haben.

DROP ICEBERG TABLE customer_iceberg;
DROP ICEBERG TABLE nation_iceberg;
DROP EXTERNAL VOLUME iceberg_external_volume;
USE DATABASE <my_other_database>;
DROP DATABASE iceberg_tutorial_db;
USE WAREHOUSE <my_other_warehouse>;
DROP WAREHOUSE iceberg_tutorial_wh;
Copy

Zusammenfassung und zusätzliche Ressourcen

In diesem Tutorial haben Sie einen durchgängigen Workflow zum Erstellen und Verwenden von Snowflake-verwalteten Apache Iceberg™-Tabellen durchlaufen.

Dabei haben Sie die folgenden Aufgaben erledigt:

Weitere Informationen zu Iceberg-Tabellen für Snowflake finden Sie in der Dokumentation zu Iceberg-Tabellen. Weitere Iceberg-Tutorials und Quickstarts finden Sie auf der Seite Snowflake-Tutorials.