Accéder aux tables Apache Iceberg™ avec un moteur externe via Snowflake Horizon Catalog

Accédez aux tables Apache Iceberg™ gérées par Snowflake à l’aide d’un moteur de requête externe via Snowflake Horizon Catalog. Pour assurer cette interopérabilité avec les moteurs externes, Apache Polaris™ est intégré à Horizon Catalog. En outre, Horizon Catalog expose l’API Apache Iceberg™ REST (API Horizon Iceberg REST Catalog). Cette API vous permet d’accéder aux tables en utilisant des moteurs de requête externes.

Vous pouvez utiliser Horizon Catalog, qui est disponible dans tous vos comptes Snowflake existants, pour lire et écrire dans des tables Iceberg gérées par Snowflake avec des moteurs de requête externes. En utilisant Horizon Catalog, vous n’avez pas besoin de synchroniser les tables Iceberg gérées par Snowflake via Snowflake Open Catalog ou de créer un compte Snowflake Open Catalog distinct pour accéder aux tables Iceberg gérées par Snowflake avec des moteurs de requête externes.

Interroger des tables Iceberg

En connectant un moteur de requête externe à des tables Iceberg via Horizon Catalog, vous pouvez effectuer les tâches suivantes :

  • Utiliser n’importe quel moteur de requête externe qui prend en charge le protocole REST Iceberg ouvert pour interroger ces tables, comme Apache Spark™.

  • Interrogez des tables Iceberg gérées par Snowflake existantes et nouvelles dans un compte Snowflake nouveau ou existant à l’aide d’un seul point de terminaison Horizon Catalog.

  • Interrogez les tables en utilisant vos utilisateurs, rôles, politiques et authentifications existants dans Snowflake.

  • Utilisez des identifiants de connexion distribués.

Pour plus d’informations sur Snowflake Horizon Catalog, voir Catalogue Snowflake Horizon.

Écriture dans les tables Iceberg

L’écriture dans les tables Iceberg en utilisant un moteur de requête externe via Horizon Catalog est en aperçu public. Pour écrire dans des tables, suivez le workflow pour l’accès aux tables Iceberg via un moteur de requête externe . Lorsque vous configurez le contrôle d’accès, assurez-vous de configurer l’accès en écriture à vos tables.

Ensuite écrivez dans les tables Iceberg.

Le schéma suivant montre des moteurs de requête externes lisant et écrivant dans les tables Iceberg gérées par Snowflake via Horizon Catalog et Snowflake lisant et écrivant dans ces tables :

Schéma qui montre des moteurs de requête externes lisant des tables Iceberg gérées par Snowflake via Horizon Catalog et Snowflake lisant et écrivant dans ces tables.

Facturation

  • API REST Iceberg de Horizon Catalog est disponible dans toutes les éditions de Snowflake.

  • Les requêtes API sont facturées à 0,5 crédit par million d’appels et sont facturées comme des services Cloud.

  • Pour l’accès aux données interrégionales, des frais standard de sortie des données interrégionales, comme indiqué dans la Table de consommation du service Snowflake sont applicables.

Note

La facturation de cette fonctionnalité est prévue pour la mi-2026, sous réserve de modifications.

Moteurs et catalogues externes pris en charge

Les tableaux suivants, bien que non exhaustifs, présentent de nombreux moteurs et catalogues externes qui s’intègrent dans l’API Horizon Iceberg REST Catalog. Cette intégration permet d’accéder aux tables Iceberg gérées par Snowflake via des systèmes externes.

Moteurs externes pris en charge

Les moteurs de requête externes suivants s’intègrent à l’API Horizon Iceberg REST Catalog :

Produit

Accéder aux tables Iceberg gérées par Snowflake via Horizon Catalog

Apache Doris™

Apache Flink™

Apache Spark™

Dremio

DuckDB

PyIceberg

StarRocks

Trino

Catalogues externes pris en charge

Les catalogues externes suivants s’intègrent à l’API Horizon Iceberg REST Catalog :

Produit

Accéder aux tables Iceberg gérées par Snowflake via Horizon Catalog

Commentaire

Apache Polaris™

AWS Glue

Pour savoir comment configurer cette intégration, voir Accéder aux données du catalogue Snowflake Horizon à ’”aide de la fédération de catalogues dans le catalogue AWS Glue Data au sein de blog AWS Big Data.

Palantir Foundry

Pour savoir comment configurer cette intégration, voir Tables Iceberg (tables virtuelles uniquement) dans la documentation Palantir.

Catalogue Databricks Unity

Non annoncé

Google BigLake Metastore

En cours de développement

Microsoft Fabric/Synapse

En cours de développement

Conditions préalables

Récupérez l’identificateur de compte de votre compte Snowflake contenant les tables Iceberg auxquelles vous souhaitez accéder. Pour obtenir des instructions, voir Identificateurs de compte. Vous spécifiez cet identificateur lorsque vous connectez un moteur de requête externe à vos tables Iceberg.

Astuce

Pour obtenir votre identificateur de compte en utilisant SQL, vous pouvez exécuter la commande suivante :

SELECT CURRENT_ORGANIZATION_NAME() || '-' || CURRENT_ACCOUNT_NAME();

(Facultatif) Connectivité privée

Pour une connectivité sécurisée, envisagez de configurer la connectivité privée entrante et sortante pour votre compte Snowflake lorsque vous accédez au point de terminaison Horizon Catalog.

Note

La connectivité privée n’est prise en charge que pour les tables Iceberg gérées par Snowflake et stockées sur Amazon S3 ou Azure Storage (ADLS).

Workflow pour accéder aux tables Iceberg à l’aide d’un moteur de requête externe

Pour accéder aux tables Iceberg en utilisant un moteur de requête externe, procédez comme suit :

  1. Créer des tables Iceberg

  2. Configurer le contrôle d’accès

  3. Obtenir un jeton d’accès pour l’authentification

  4. Vérifier les autorisations du jeton d’accès

  5. (Facultatif) Configurer des politiques de protection des données

  6. Connecter un moteur de requête externe aux tables Iceberg via Horizon Catalog

  7. Interrogez les tables Iceberg ou:ref:écrivez dans les tables Iceberg <label-tables_iceberg_query_using_external_query_engine_snowflake_horizon_write_to_iceberg_tables>

Étape 1 : Créer des tables Iceberg

Important

Si vous avez déjà des tables Iceberg gérées par Snowflake auxquelles vous souhaitez accéder, vous pouvez ignorer cette étape.

Dans cette étape, vous créez des tables Iceberg gérées par Snowflake qui utilisent Snowflake comme catalogue, afin de pouvoir y accéder avec un moteur de requête externe. Pour obtenir des instructions, reportez-vous aux rubriques suivantes :

Étape 2 : Configurer le contrôle d’accès

Important

Si vous disposez déjà de rôles configurés avec accès aux tables Iceberg auxquelles vous souhaitez accéder, vous pouvez ignorer cette étape.

Dans cette étape, vous configurez le contrôle d’accès pour les tables Iceberg gérées par Snowflake auxquelles vous souhaitez accéder avec un moteur de requête externe. Par exemple, vous pouvez configurer les rôles suivants dans Snowflake :

  • Rôle data_engineer, qui a accès à tous les schémas et à toutes les tables Iceberg gérées par Snowflake dans une base de données.

  • Rôle data_analyst, qui a accès à un schéma de la base de données et a accès uniquement à deux tables Iceberg gérées par Snowflake dans ce schéma.

Pour plus d’informations, consultez les sections suivantes :

Configurer l’accès en lecture à vos tables Iceberg

Pour interroger des tables Iceberg, le rôle utilisé pour effectuer l’opération doit également disposer du privilège SELECT sur la table Iceberg et du privilèges USAGE sur la base de données et le schéma parents. Pour un exemple de l’octroi de ces privilèges à un rôle, voir Exemple : Configurer un utilisateur de compte de service.

Important

Le rôle qui possède le privilège OWNERSHIP sur une table Iceberg doit conserver le privilège USAGE sur le volume externe associé à la table. Si le rôle de propriétaire n’a pas de privilège USAGE sur le volume externe, toute opération de lecture ou d’écriture sur la table qui demande des identifiants de connexion distribués échouera.

Exemple : Configurer un utilisateur de compte de service

L’exemple suivant configure un utilisateur de compte de service dans Snowflake avec un accès en lecture seule à une table Iceberg :

  • Crée un rôle data_engineer.

  • Accorde les privilèges USAGE et MONITOR au rôle data_engineer sur la base de données iceberg_test_db et son schéma public.

  • Accorde les privilèges SELECT sur la table Iceberg test_table.

  • Crée un utilisateur de service nommé horizon_rest_srv_account_user et attribue le rôle data_engineer à cet utilisateur.

CREATE OR REPLACE ROLE data_engineer;

GRANT USAGE ON DATABASE iceberg_test_db TO ROLE data_engineer;
GRANT USAGE ON SCHEMA iceberg_test_db.public TO ROLE data_engineer;

GRANT SELECT ON TABLE iceberg_test_db.public.test_table TO ROLE data_engineer;

CREATE OR REPLACE USER horizon_rest_srv_account_user TYPE=SERVICE DEFAULT_ROLE=data_engineer;

GRANT ROLE data_engineer TO USER horizon_rest_srv_account_user;

(Facultatif) Appliquer des autorisations à venir sur des tables Iceberg

Pour garantir l’accès à toutes les nouvelles tables Iceberg créées dans un schéma, utilisez la syntaxe GRANT … ON FUTURE ICEBERG TABLES.

L’exemple suivant accorde l’accès au rôle data_engineer à toutes les tables Iceberg créées sous un schéma nommé my_schema.

GRANT SELECT ON FUTURE ICEBERG TABLES IN SCHEMA my_db.my_schema TO ROLE data_engineer;

Pour plus d’informations sur le contrôle d’accès dans Snowflake, consultez les rubriques suivantes :

Configurer l’accès en écriture à vos tables Iceberg

Le tableau suivant décrit les privilèges requis pour les opérations d’écriture sur les tables Iceberg :

Fonctionnement

Privilèges nécessaires

Opérations de langage de manipulation de données (DML)

Important

Un rôle utilisé pour exécuter l’opération doit avoir tous les privilèges suivants :

  • Les privilèges SELECT, UPDATE, TRUNCATE, INSERT et DELETE sur la table

  • Le privilège USAGE pour le schéma parent sous lequel la table est imbriquée

  • Le privilège USAGE sur la base de données ou le schéma parent sous lequel la table est imbriquée

CREATE ICEBERG TABLE

Un rôle utilisé pour exécuter cette opération doit disposer des privilèges suivants :

  • Privilège CREATE ICEBERG TABLE sur le schéma

  • Privilège USAGE sur le volume externe

CREATE SCHEMA

Un rôle utilisé pour exécuter l’opération doit avoir le privilègeCREATESCHEMA sur la base de données parent.

Renommer une table

Un rôle utilisé pour exécuter l’opération doit avoir le privilègeOWNERSHIP sur la table.

Important

Pour déplacer la table vers un nouveau schéma, assurez-vous que votre rôle dispose également du privilège CREATEICEBERGTABLE sur le schéma de destination.

Toutes les autres opérations sur une table

Un rôle utilisé pour exécuter l’opération doit avoir le privilègeOWNERSHIP sur la table en plus des privilèges sur le schéma et la base de données. Par exemple, vous devez disposer des privilèges suivants pour exécuter l’opération ALTERICEBERGTABLE …ADDCOLUMN ou ALTERICEBERGTABLE …DROPCOLUMN.

Pour plus d’informations sur le contrôle d’accès dans Snowflake, consultez les rubriques suivantes :

Étape 3 : Obtenir un jeton d’accès pour l’authentification

Dans cette étape, vous obtenez un jeton d’accès, que vous devez avoir pour vous authentifier auprès du point de terminaison Horizon Catalog de votre compte Snowflake. Vous devez obtenir un jeton d’accès pour chaque utilisateur (service ou humain) et rôle configuré avec accès aux tables Iceberg gérées par Snowflake. Par exemple, vous devez obtenir un jeton d’accès pour un utilisateur avec le rôle DATA_ENGINEER et un autre utilisateur avec le rôle DATA_ANALYST.

Vous spécifierez ce jeton d’accès plus tard lorsque vous connectez un moteur de requête externe aux tables Iceberg via Horizon Catalog.

Vous pouvez obtenir un jeton d’accès en utilisant l’une des options d’authentification suivantes :

OAuth externe

Si vous utilisez OAuth externe, générez un jeton d’accès pour votre fournisseur d’identité. Pour obtenir des instructions, voir Présentation de External OAuth.

Note

Pour OAuth externe, vous pouvez également configurer votre connexion au moteur avec l’actualisation automatique du jeton au lieu de spécifier un jeton d’accès.

Authentification par paire de clés

Si vous utilisez l’authentification par paire de clés pour obtenir un jeton d’accès, vous devez signer un jeton Web JSON (JWT) avec votre clé privée.

Les étapes suivantes expliquent comment générer un jeton d’accès pour l’authentification par paire de clés :

  1. Configurer l’authentification par paire de clés

  2. Accorder un rôle à l’utilisateur

  3. Générer un jeton Web JSON (JWT)

  4. Générer un jeton d’accès

Étape 1 : Configurer l’authentification par paire de clés

Dans cette étape, vous effectuez les tâches suivantes :

  • Générer une clé privée.

  • Générer une clé publique

  • Stocker les clés privées et publiques en toute sécurité

  • Octroyer le privilège d’attribuer une clé publique à un utilisateur de Snowflake

  • Attribuer la clé publique à un utilisateur Snowflake

  • Vérifier l’empreinte digitale de la clé publique de l’utilisateur

Pour obtenir des instructions, voir Configuration de l’authentification par paire de clés.

Étape 2 : Accorder un rôle à l’utilisateur.

Pour accorder à l’utilisateur de l’authentification paire de clés le rôle Snowflake qui a les privilèges sur les tables auxquelles vous souhaitez accéder, exécutez la commande GRANT ROLE. Par exemple, pour accorder le rôle ENGINEER à l’utilisateur my_service_user, exécutez les commandes suivantes :

GRANT ROLE ENGINEER to user my_service_user;

Étape 3 : Générer un jeton Web JSON (JWT)

Dans cette étape, vous utilisez SnowSQL pour générer un jeton Web JSON (JWT) pour l’authentification par paire de clés.

Note

Utilisez SnowSQL pour générer un JWT :

snowsql --private-key-path "<private_key_file>" \
  --generate-jwt \
  -h "<account_identifier>.snowflakecomputing.com" \
  -a "<account_locator>" \
  -u "<user_name>"

Où :

  • <private_key_file> is the path to your private key file that corresponds to the public key assigned to your Snowflake user. For example: /Users/jsmith/.ssh/rsa_key.p8.

  • <account_identifier> est l’identificateur de compte pour votre compte Snowflake au format <organization_name>-<account_name>. Pour trouver l’identificateur de compte, consultez Moteurs et catalogues externes pris en charge. Un exemple d’identificateur de compte est myorg-myaccount.

  • <account_locator> est le localisateur de compte pour votre compte Snowflake.

    Pour trouver votre localisateur de compte, reportez-vous à Localisez les informations de compte Snowflake dans Snowsight et notez le localisateur de compte dans la boîte de dialogue Account Details.

  • <user_name> est le nom d’utilisateur d’un utilisateur Snowflake dont la clé publique est attribuée à l’utilisateur.

Étape 4 : Générer un jeton d’accès

Important

Pour générer un jeton d’accès, vous devez d’abord générer un JWT. Vous devez d’abord générer un JWT parce que vous utilisez le JWT pour générer le jeton d’accès.

Utilisez une commande curl pour générer un jeton d’accès :

curl -i --fail -X POST "https://<account_identifier>.snowflakecomputing.com/polaris/api/catalog/v1/oauth/tokens" \
 --header 'Content-Type: application/x-www-form-urlencoded' \
 --data-urlencode 'grant_type=client_credentials' \
 --data-urlencode 'scope=session:role:<role>' \
 --data-urlencode 'client_secret=<JWT_token>'

Où :

  • <account_identifier> est l’identificateur de compte pour votre compte Snowflake au format <organization_name>-<account_name>. Pour trouver l’identificateur de compte, consultez Moteurs et catalogues externes pris en charge. Un exemple d’identificateur de compte est myorg-myaccount.

  • <role> est le rôle Snowflake auquel l’accès aux tables Iceberg est accordé, tel que ENGINEER.

  • <JWT_token> est le JWT que vous avez généré à l’étape précédente.

Jeton d’accès programmatique (PAT)

Si vous utilisez PATs, générez un PAT pour l’authentification.

Tout d’abord, vous générez un PAT, que vous utilisez pour connecter un moteur de requête externe à des tables Iceberg. Ensuite, vous générez un jeton d’accès, que vous n’utilisez que pour vérifier les autorisations de votre PAT.

Étape 1 : Générer un PAT

Pour des instructions sur la façon de configurer et de générer un PAT, voir Utilisation de jetons d’accès programmatique pour l’authentification.

L’exemple suivant crée un jeton d’accès programmatique (PAT) pour l’utilisateur du compte de service que vous avez créé à l’étape précédente en utilisant la commande ALTER USER … ADD PROGRAMMATIC ACCESS TOKEN (PAT) :

ALTER USER IF EXISTS HORIZON_REST_SRV_ACCOUNT_USER
ADD PAT HORIZON_REST_SRV_ACCOUNT_USER_PAT
  DAYS_TO_EXPIRY = 7
  ROLE_RESTRICTION = 'DATA_ENGINEER'
  COMMENT = 'HORIZON REST API PAT FOR SERVICE ACCOUNT';

Étape 2 : Générer un jeton d’accès pour votre PAT

Dans cette étape, vous générez un jeton d’accès pour votre PAT.

Attention

Vous ne spécifiez le jeton d’accès que vous générez à cette étape que lorsque vous vérifiez les autorisations pour votre PAT. Lorsque vous connectez un moteur de requête externe à des tables Iceberg, vous devez spécifier le PAT que vous avez généré à l’étape précédente, et non le jeton d’accès que vous générez à cette étape.

Utilisez une commande curl pour générer un jeton d’accès pour votre PAT :

curl -i --fail -X POST "https://<account_identifier>.snowflakecomputing.com/polaris/api/catalog/v1/oauth/tokens" \
 --header 'Content-Type: application/x-www-form-urlencoded' \
 --data-urlencode 'grant_type=client_credentials' \
 --data-urlencode 'scope=session:role:<role>' \
 --data-urlencode 'client_secret=<PAT_token>'

Où :

  • <account_identifier> est l’identificateur de compte pour votre compte Snowflake au format <organization_name>-<account_name>. Pour trouver l’identificateur de compte, consultez Moteurs et catalogues externes pris en charge. Un exemple d’identificateur de compte est myorg-myaccount.

  • <role> est le rôle Snowflake qui est attribué à votre PAT et a accès aux tables Iceberg que vous souhaitez interroger ou dans lesquelles vous souhaitez écrire, par exemple ENGINEER.

  • <PAT_token> est la valeur du jeton PAT que vous avez généré à l’étape précédente.

Étape 4 : Vérifier les autorisations du jeton d’accès

À cette étape, vous vérifiez les autorisations pour le jeton d’accès que vous avez obtenu à l’étape précédente.

Vérifier l’accès au point de terminaison IRC Horizon

Utilisez une commande curl pour vérifier que vous avez l’autorisation d’accéder à votre point de terminaison IRC Horizon :

curl -i --fail -X GET "https://<account_identifier>.snowflakecomputing.com/polaris/api/catalog/v1/config?warehouse=<database_name>" \
-H "Authorization: Bearer <access_token>" \
-H "Content-Type: application/json"

Où :

  • <account_identifier> est l’identificateur de compte pour votre compte Snowflake au format <organization_name>-<account_name>. Pour trouver l’identificateur de compte, consultez Moteurs et catalogues externes pris en charge. Un exemple d’identificateur de compte est myorg-myaccount.

  • <access_token> est le jeton d’accès que vous avez généré. Si vous utilisez un PAT, cette valeur est le jeton d’accès que vous avez généré, et non le jeton d’accès personnel (PAT) que vous avez généré.

  • <database_name> est le nom de la base de données qui contient les tables Iceberg auxquelles vous souhaitez accéder.

    Important

    Si votre base de données a été créée sans guillemets autour du nom, vous devez spécifier le nom de la base de données en majuscules, même si elle a été créée avec des lettres minuscules.

Exemple de valeur de retour :

{
  "defaults": {
    "default-base-location": ""
  },
  "overrides": {
    "prefix": "MY-DATABASE"
  }
}

Récupérer les métadonnées d’une table

Vous pouvez également effectuer une requête GET pour récupérer les métadonnées d’une table. Snowflake utilise l’opération loadTable pour charger les métadonnées des tables depuis votre catalogue REST.

curl -i --fail -X GET "https://<account_identifier>.snowflakecomputing.com/polaris/api/catalog/v1/<database_name>/namespaces/<namespace_name>/tables/<table_name>" \
 -H "Authorization: Bearer <access_token>" \
 -H "Content-Type: application/json"

Où :

  • <account_identifier> est l’identificateur de compte pour votre compte Snowflake au format <organization_name>-<account_name>. Pour trouver l’identificateur de compte, consultez Moteurs et catalogues externes pris en charge. Un exemple d’identificateur de compte est myorg-myaccount.

  • <database_name> est la base de données de la table dont vous souhaitez récupérer les métadonnées.

  • <namespace_name> est l’espace de noms de la table dont vous souhaitez récupérer les métadonnées.

  • <table_name> est la table dont vous souhaitez récupérer les métadonnées.

  • <access_token> est le jeton d’accès que vous avez généré. Si vous utilisez un PAT, cette valeur est le jeton d’accès que vous avez généré, et non le jeton d’accès personnel (PAT) que vous avez généré.

Important

Si votre base de données, votre espace de noms ou votre table a été créé sans guillemets autour du nom, vous devez spécifier le nom de la base de données, des espaces de noms ou de la table en majuscules, même si l’objet a été créé avec des lettres minuscules.

(Facultatif) Étape 5 : Configurer des politiques de protection des données

Dans cette étape, vous configurez des politiques de protection des données pour les tables Iceberg. Si vous n’avez pas de tables à protéger à l’aide de politiques de données Snowflake, vous pouvez passer à l’étape suivante.

Note

Les tables protégées par les politiques de protection des données sont accessibles via l’API REST Horizon Iceberg et en utilisant Apache Spark™.

Pour obtenir des instructions sur la configuration des politiques de protection des données, consultez Configurer des politiques de protection des données sur les tables Iceberg accessibles via l’API REST Horizon Iceberg et en utilisant Apache Spark™.

Étape 6 : Connecter un moteur de requête externe aux tables Iceberg via Horizon Catalog

Dans cette étape, vous connectez un moteur de requête externe aux tables Iceberg via Horizon Catalog. Grâce à cette connexion, vous pouvez accéder aux tables en utilisant le moteur de requête externe.

Les moteurs externes utilisent le point de terminaison Apache Iceberg™ REST exposé par Snowflake. Pour votre compte Snowflake, ce point de terminaison a le format suivant :

https://<account_identifier>.snowflakecomputing.com/polaris/api/catalog

L’exemple de code dans cette étape montre comment établir une connexion dans Spark. L’exemple de code est dans PySpark. Pour plus d’informations, consultez les sections suivantes :

Se connecter à l’aide de OAuth externe ou de l’authentification par paire de clés

Utilisez l’une des configurations suivantes pour vous connecter :

Connecter un moteur de requête externe sans appliquer de politiques de données

  • Pour connecter le moteur de requête externe aux tables Iceberg en utilisant External OAuth ou l’authentification par paire de clés, utilisez l’exemple de code suivant.

Ce code n’applique pas de politiques de protection des données :

# Snowflake Horizon Catalog Configuration, change as per your environment

CATALOG_URI = "https://<account_identifier>.snowflakecomputing.com/polaris/api/catalog"
HORIZON_SESSION_ROLE = f"session:role:<role>"
CATALOG_NAME = "<database_name>" #provide in UPPER CASE

# Cloud Service Provider Region Configuration (where the Iceberg data is stored)
REGION = "eastus2"

# Paste the External Oauth Access token that you generated in Snowflake here
ACCESS_TOKEN = "<your_access_token>"

# Iceberg Version
ICEBERG_VERSION = "1.9.1"

def create_spark_session():
  """Create and configure Spark session for Snowflake Iceberg access."""
  spark = (
      SparkSession.builder
      .appName("SnowflakeIcebergReader")
      .master("local[*]")

# JAR Dependencies for Iceberg and Azure
      .config(
          "spark.jars.packages",
          f"org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:{ICEBERG_VERSION},"
          f"org.apache.iceberg:iceberg-aws-bundle:{ICEBERG_VERSION}"
          # for Azure storage, use the below package and comment above azure bundle
          # f"org.apache.iceberg:iceberg-azure-bundle:{ICEBERG_VERSION}"
      )

      # Iceberg SQL Extensions
      .config("spark.sql.extensions", "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions")
      .config("spark.sql.defaultCatalog", CATALOG_NAME)

      # Horizon REST Catalog Configuration
      .config(f"spark.sql.catalog.{CATALOG_NAME}", "org.apache.iceberg.spark.SparkCatalog")
      .config(f"spark.sql.catalog.{CATALOG_NAME}.type", "rest")
      .config(f"spark.sql.catalog.{CATALOG_NAME}.uri", CATALOG_URI)
      .config(f"spark.sql.catalog.{CATALOG_NAME}.warehouse", CATALOG_NAME)
      .config(f"spark.sql.catalog.{CATALOG_NAME}.token", ACCESS_TOKEN)
      .config(f"spark.sql.catalog.{CATALOG_NAME}.scope", HORIZON_SESSION_ROLE)
      .config(f"spark.sql.catalog.{CATALOG_NAME}.client.region", REGION)

      # Required for vended credentials
      .config(f"spark.sql.catalog.{CATALOG_NAME}.header.X-Iceberg-Access-Delegation", "vended-credentials")
      .config("spark.sql.iceberg.vectorization.enabled", "false")
      .getOrCreate()
  )
  spark.sparkContext.setLogLevel("ERROR")
  return spark

Où :

  • <account_identifier> est votre identificateur de compte Snowflake pour le compte Snowflake qui contient les tables Iceberg auxquelles vous souhaitez accéder. Pour trouver cet identificateur, voir Moteurs et catalogues externes pris en charge.

  • <your_access_token> est le jeton d’accès que vous avez obtenu. Pour l’obtenir, voir. Étape 3 : Obtenir un jeton d’accès pour l’authentification.

    Note

    Pour OAuth externe, vous pouvez également configurer votre connexion au moteur avec l’actualisation automatique du jeton au lieu de spécifier un jeton d’accès.

  • <database_name> est le nom de la base de données de votre compte Snowflake qui contient les tables Iceberg gérées par Snowflake auxquelles vous souhaitez accéder.

    Note

    La propriété .warehouse dans Spark attend le nom de votre base de données Snowflake, et non le nom de votre entrepôt Snowflake.

  • <role> est le rôle dans Snowflake qui est configuré avec accès aux tables Iceberg auxquelles vous souhaitez accéder. Par exemple : DATA_ENGINEER.

Important

Par défaut, l’exemple de code est configuré pour les tables Apache Iceberg™ stockées sur Amazon S3. Si vos tables Iceberg sont stockées sur Azure Storage (ADLS), procédez comme suit :

  1. Commentez la ligne suivante : f"org.apache.iceberg:iceberg-aws-bundle:{ICEBERG_VERSION}"

  2. Ne commentez pas la ligne suivante : # f"org.apache.iceberg:iceberg-azure-bundle:{ICEBERG_VERSION}"

Connecter un moteur de requête externe avec des politiques de données appliquées

Se connecter à l’aide d’un jeton d’accès programmatique (PAT)

Utilisez l’une des configurations suivantes pour vous connecter :

Connecter un moteur de requête externe sans appliquer de politiques de données

  • Pour connecter le moteur de requête externe aux tables Iceberg en utilisant un jeton d’accès programmatique (PAT), utilisez l’exemple de code suivant :

Ce code n’applique pas de politiques de protection des données :

# Snowflake Horizon Catalog Configuration, change as per your environment

CATALOG_URI = "https://<account_identifier>.snowflakecomputing.com/polaris/api/catalog"
HORIZON_SESSION_ROLE = f"session:role:<role>"
CATALOG_NAME = "<database_name>" #provide in UPPER CASE

# Cloud Service Provider Region Configuration (where the Iceberg data is stored)
REGION = "eastus2"

# Paste the PAT you generated in Snowflake here
PAT_TOKEN = "<your_PAT_token>"

# Iceberg Version
ICEBERG_VERSION = "1.9.1"

def create_spark_session():
  """Create and configure Spark session for Snowflake Iceberg access."""
  spark = (
      SparkSession.builder
      .appName("SnowflakeIcebergReader")
      .master("local[*]")

# JAR Dependencies for Iceberg and Azure
      .config(
          "spark.jars.packages",
          f"org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:{ICEBERG_VERSION},"
          f"org.apache.iceberg:iceberg-aws-bundle:{ICEBERG_VERSION}"
          # for Azure storage, use the below package and comment above azure bundle
          # f"org.apache.iceberg:iceberg-azure-bundle:{ICEBERG_VERSION}"
      )

      # Iceberg SQL Extensions
      .config("spark.sql.extensions", "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions")
      .config("spark.sql.defaultCatalog", CATALOG_NAME)

      # Horizon REST Catalog Configuration
      .config(f"spark.sql.catalog.{CATALOG_NAME}", "org.apache.iceberg.spark.SparkCatalog")
      .config(f"spark.sql.catalog.{CATALOG_NAME}.type", "rest")
      .config(f"spark.sql.catalog.{CATALOG_NAME}.uri", CATALOG_URI)
      .config(f"spark.sql.catalog.{CATALOG_NAME}.warehouse", CATALOG_NAME)
      .config(f"spark.sql.catalog.{CATALOG_NAME}.credential", PAT_TOKEN)
      .config(f"spark.sql.catalog.{CATALOG_NAME}.scope", HORIZON_SESSION_ROLE)
      .config(f"spark.sql.catalog.{CATALOG_NAME}.client.region", REGION)

      # Required for vended credentials
      .config(f"spark.sql.catalog.{CATALOG_NAME}.header.X-Iceberg-Access-Delegation", "vended-credentials")
      .config("spark.sql.iceberg.vectorization.enabled", "false")
      .getOrCreate()
  )
  spark.sparkContext.setLogLevel("ERROR")
  return spark

Où :

  • <account_identifier> est votre identificateur de compte Snowflake pour le compte Snowflake qui contient les tables Iceberg auxquelles vous souhaitez accéder. Pour trouver cet identificateur, voir Moteurs et catalogues externes pris en charge.

  • <your_PAT_token> est le PAT que vous avez obtenu. Pour l’obtenir, voir. Étape 3 : Obtenir un jeton d’accès pour l’authentification.

  • <role> est le rôle dans Snowflake qui est configuré avec accès aux tables Iceberg auxquelles vous souhaitez accéder. Par exemple : DATA_ENGINEER.

  • <database_name> est le nom de la base de données de votre compte Snowflake qui contient les tables Iceberg gérées par Snowflake auxquelles vous souhaitez accéder.

    Note

    La propriété .warehouse dans Spark attend le nom de votre base de données Snowflake, et non le nom de votre entrepôt Snowflake.

Important

Par défaut, l’exemple de code est configuré pour les tables Apache Iceberg™ stockées sur Amazon S3. Si vos tables Iceberg sont stockées sur Azure Storage (ADLS), procédez comme suit :

  1. Commentez la ligne suivante : f"org.apache.iceberg:iceberg-aws-bundle:{ICEBERG_VERSION}"

  2. Ne commentez pas la ligne suivante : # f"org.apache.iceberg:iceberg-azure-bundle:{ICEBERG_VERSION}"

Connecter un moteur de requête externe avec des politiques de données appliquées

Étape 7 : Accéder aux tables Iceberg

Cette section comprend des exemples de code permettant d’utiliser Apache Spark™ pour interroger et écrire dans des tables Iceberg.

Interroger des tables Iceberg

Cette section fournit les exemples de code suivants pour utiliser Apache Spark™ afin d’interroger des tables Iceberg :

  • Afficher les espaces de noms

  • Utiliser des espaces de noms

  • Afficher les tables

  • Interroger une table

Afficher les espaces de noms

spark.sql("show namespaces").show()

Utiliser l’espace de noms

spark.sql("use namespace <your_schema_name_in_snowflake>")

Afficher les tables

spark.sql("show tables").show()

Interroger une table

spark.sql("use namespace spark_demo")
spark.sql("select * from <your_table_name_in_snowflake>").show()

Écriture dans les tables Iceberg

Cette section fournit les exemples de code suivants pour utiliser Apache Spark™ afin d’écrire dans les tables Iceberg :

  • CREATE TABLE

  • INSERT INTO <table>

  • ALTER TABLE … ADD COLUMN

  • UPDATE TABLE … WHERE

  • DELETE TABLE … WHERE

  • TRUNCATE TABLE

  • RENAME TABLE

  • DROP TABLE

CREATE TABLE

spark.sql("CREATE TABLE MY_TABLE (COLUMN1 INT) USING ICEBERG").show();

INSERT INTO <table>

spark.sql("INSERT INTO MY_TABLE VALUES (600)").show()

ALTER TABLE … ADD COLUMN

spark.sql("ALTER TABLE MY_TABLE ADD COLUMN COLUMN2 INT").show()

UPDATE TABLE … WHERE

spark.sql("UPDATE MY_TABLE SET COLUMN2 = 10 WHERE COLUMN1 = 100").show()

DELETE TABLE … WHERE

spark.sql("DELETE FROM MY_TABLE WHERE COLUMN2 = 10").show()

TRUNCATE TABLE

spark.sql("TRUNCATE TABLE MY_TABLE").show()

RENAME TABLE

spark.sql("ALTER TABLE MY_TABLE RENAME TO MY_NEW_TABLE")

DROP TABLE

spark.sql("DROP TABLE MY_TABLE")

Considérations relatives à l’accès des tables Iceberg avec un moteur de requête externe

Cette section répertorie les considérations relatives à l’accès, à l’interrogation et à l’écriture dans les tables Iceberg avec un moteur de requête externe.

Tenez compte des points suivants lorsque vous interrogez des tables Iceberg avec un moteur de requête externe :

  • Iceberg

    • Pour les tables dans Snowflake :

      • Seules les tables Iceberg gérées par Snowflake sont prises en charge.

  • Annonces :

  • Réseau et connexion privée :

    • L’utilisation de politiques réseau définies au niveau de l’utilisateur n’est pas prise en charge avec cette fonctionnalité.

    • Pour Règles réseau gérées par Snowflake, les adresses IP de sortie statiques ne sont pas prises en charge.

    • L’octroi explicite de l’accès au point de terminaison Horizon Catalog à vos comptes de stockage n’est pas pris en charge. Nous vous recommandons d’utiliser une connexion privée pour sécuriser la connexion entre les moteurs externes et Horizon Catalog, ainsi qu’entre Horizon Catalog et votre compte de stockage.

  • Clouds :

    • Commercial : Cette fonctionnalité n’est prise en charge que pour les tables Iceberg gérées par Snowflake et stockées sur Amazon S3, Google Cloud ou Azure pour toutes les régions de Cloud. Le stockage non AWS compatible avec S3 n’est pas encore pris en charge.

    • FedRAMP (modéré) : Cette fonctionnalité est prise en charge pour les tables Iceberg gérées par Snowflake qui sont stockées sur les déploiements FedRAMP (modérés) sur AWS Gov Commercial (US) dans les régions us-east-1 et us-west-2.

    • Pour les tables Iceberg stockées sur Amazon S3 :

      • Si vous voulez utiliser le chiffrement SSE-KMS, contactez le support client ou l’équipe de votre compte pour obtenir de l’aide sur l’activation de l’accès.

        Note

        L’écriture dans les volumes externes chiffrés par KMS n’est pas prise en charge.

    • Pour les tables Iceberg stockées sur Azure :

      • Le réseau virtuel Azure (VNet) n’est pas pris en charge.

  • Authentification :

    • Pour l’authentification par paire de clés, la rotation de la paire de clés n’est pas prise en charge.

    • La fédération d’identité de charge de travail n’est pas prise en charge avec cette fonctionnalité.

Tenez compte des points suivants lorsque vous interrogez (lisez) des tables Iceberg avec un moteur de requête externe :

  • Iceberg

    • La requête dans les tables suivantes n’est pas prise en charge :

      • Tables distantes

      • Tables natives Snowflake

      • Tables Iceberg gérées en externe, y compris les tables Iceberg basées sur Delta et les tables Iceberg gérées par Snowflake que vous avez chargées avec des données provenant de fichiers de données Parquet compatibles avec Iceberg en utilisant la commande de table COPY INTO

    • La lecture des tables Iceberg v2 est prise en charge.

    • La lecture des tables Iceberg V3 (avant-première publique) est prise en charge pour les fonctionnalités suivantes :

      • Type de données de variante

      • Lignée de lignes

      Toutes les autres fonctionnalités Iceberg V3, y compris les valeurs par défaut et le type de données géographique, ne sont pas prises en charge.

  • Contrôle d’accès :

  • Tables clonées et converties :

    • La lecture des tables clonées ou converties n’est pas prise en charge avec les identifiants de connexion distribués. Pour lire ces tables, utilisez un accès direct au stockage d’objets.

Tenez compte des points suivants lorsque vous écrivez sur les tables Iceberg avec un moteur de requête externe :

  • Opérations de table :

    • Vous ne pouvez pas spécifier un emplacement de base avec votre instruction CREATETABLE.

      Lorsque vous créez une table gérée par Snowflake sans spécifier d’emplacement de base, Snowflake construit le chemin suivant pour votre table : STORAGE_BASE_URL/database/schema/table_name.randomId/[data | metadata]/

    • CREATE TABLE AS SELECT (CTAS) depuis un moteur externe n’est pas pris en charge.

    • Les suppressions d’égalité ne sont pas prises en charge.

    • Vous ne pouvez pas écrire dans des tables en utilisant des suppressions au niveau des lignes ; seul le mode copie sur écriture est pris en charge.

    • La création de balises et de branches Iceberg n’est pas prise en charge.

    • Les écritures du moteur externe ne sont prises en charge que sur la version 2 d’Iceberg. L’écriture dans des tables Iceberg version 3 (v3) (avant-première publique) n’est actuellement pas prise en charge.

    • L’écriture dans les volumes externes chiffrés par KMS n’est pas prise en charge.

    • L’écriture dans des tables dynamiques dans Snowflake n’est pas prise en charge.

    • L’écriture dans des tables Iceberg partagées n’est pas prise en charge.

    • L’enregistrement des tables Iceberg n’est pas pris en charge.

  • Opérations de maintenance

    • Vous ne pouvez pas restaurer une table sur un instantané précédent.

    • L’opération d’expiration de l’instantané n’est pas prise en charge.

    • Vous ne pouvez pas mettre à niveau une table Iceberg de v2 vers v3.

  • Tables clonées et converties :

    • L’écriture dans des tables clonées ou converties n’est pas prise en charge avec les identifiants de connexion distribués. Pour écrire dans ces tables, connectez votre moteur de requête externe directement au stockage d’objets dans lequel vos tables sont stockées.

    • Vous ne pouvez pas écrire dans une table Iceberg qui a été convertie de gérée en externe à gérée par Snowflake.

  • Flux :

    • Sur les tables Iceberg V2, les opérations de copie sur écriture font que les flux standard représentent une ligne mise à jour ou déplacée comme un enregistrement DELETE suivi d’un enregistrement INSERT pour la même ligne.

  • Politiques de contrôle d’accès détaillées :

    • L’écriture dans des tables disposant de politiques de contrôle d’accès détaillées ou de balises n’est pas prise en charge.