Se connecter à Snowflake Open Catalog avec l’OAuth externe
Cette rubrique décrit comment se connecter à Snowflake Open Catalog avec l’OAuth externe à l’aide d’une application cliente.
L’exemple de code de cette rubrique montre comment se connecter à l’aide d’Apache Spark™, et l’exemple de code se trouve dans PySpark.
Note
Si vous utilisez Snowflake pour interroger des tables gérées par Open Catalog, vous pouvez créer une intégration de catalogue pour Snowflake qui utilise l’OAuth externe. Pour plus d’informations, consultez [CREATE CATALOG INTEGRATION (Snowflake Open Catalog)] (https://docs.snowflake.com/en/sql-reference/sql/create-catalog-integration-open-catalog) dans la documentation Snowflake.
Conditions préalables
Avant de pouvoir vous connecter à Open Catalog avec l’OAuth externe, vous devez configurer l’OAuth externe dans Open Catalog. Pour obtenir des instructions, consultez [Configurer l’OAuth externe dans Snowflake Open Catalog] (external-oauth-configure.md).
Se connecter à Open Catalog à l’aide d’un jeton d’actualisation automatique (méthode préférée)
Utilisez cette méthode pour vous connecter à l’aide d’un jeton d’actualisation automatique afin de ne pas avoir à actualiser manuellement le jeton.
import pyspark
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName('iceberg_lab') \
.config('spark.jars.packages', 'org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.4.1,<maven_coordinate>') \
.config('spark.sql.extensions', 'org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions') \
.config('spark.sql.defaultCatalog', 'opencatalog') \
.config('spark.sql.catalog.opencatalog', 'org.apache.iceberg.spark.SparkCatalog') \
.config('spark.sql.catalog.opencatalog.type', 'rest') \
.config('spark.sql.catalog.opencatalog.uri','https://<open_catalog_account_identifier>.snowflakecomputing.com/polaris/api/catalog') \
.config('spark.sql.catalog.opencatalog.header.X-Iceberg-Access-Delegation','vended-credentials') \
.config('spark.sql.catalog.opencatalog.warehouse','<catalog_name>') \
.config('spark.sql.catalog.opencatalog.rest.auth.type','oauth2') \
.config('spark.sql.catalog.opencatalog.oauth2-server-uri','<oauth2_server_uri>') \
.config('spark.sql.catalog.opencatalog.credential','<oauth_client_id>:<oauth_client_secret>') \
.config('spark.sql.catalog.opencatalog.scope','SESSION:ROLE:<custom_role>') \
.config('spark.sql.catalog.opencatalog.audience','https://<open_catalog_account_identifier>.snowflakecomputing.com') \
.getOrCreate()
Se connecter à Open Catalog à l’aide d’un jeton d’accès
Si nécessaire, vous pouvez vous connecter à Open Catalog à l’aide d’un jeton d’accès. Cependant, ce jeton d’accès expirera et vous devrez l’actualiser manuellement. Vous pouvez également [vous connecter à l’aide d’un jeton d’actualisation automatique] (#connect-with-open-catalog-by-using-automatic-refresh-token-preferred-method).
L’exemple de code suivant montre comment se connecter à Open Catalog à l’aide de Spark.
Paramètres
import pyspark
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName('iceberg_lab') \
.config('spark.jars.packages', 'org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.4.1,<maven_coordinate>') \
.config('spark.sql.extensions', 'org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions') \
.config('spark.sql.defaultCatalog', 'opencatalog') \
.config('spark.sql.catalog.opencatalog', 'org.apache.iceberg.spark.SparkCatalog') \
.config('spark.sql.catalog.opencatalog.type', 'rest') \
.config('spark.sql.catalog.opencatalog.uri','https://<open_catalog_account_identifier>.snowflakecomputing.com/polaris/api/catalog') \
.config('spark.sql.catalog.opencatalog.header.X-Iceberg-Access-Delegation','vended-credentials') \
.config('spark.sql.catalog.opencatalog.token','<access_token>') \
.config('spark.sql.catalog.opencatalog.warehouse','<catalog_name>') \
.getOrCreate()
Se connecter à l’aide d’une connexion interrégionale (Amazon S3 uniquement)
L’exemple de code suivant montre comment se connecter à Open Catalog lorsque les conditions suivantes sont remplies :
Votre compte Open Catalog est hébergé sur Amazon S3.
Votre fournisseur de stockage externe est Amazon S3.
Votre compte Open Catalog est hébergé dans une région S3 différente de la région S3 où se trouve le compartiment de stockage contenant vos tables Apache Iceberg™.
import pyspark
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName('iceberg_lab') \
.config('spark.jars.packages', 'org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.4.1,software.amazon.awssdk:bundle:2.20.160') \
.config('spark.sql.extensions', 'org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions') \
.config('spark.sql.defaultCatalog', 'opencatalog') \
.config('spark.sql.catalog.opencatalog', 'org.apache.iceberg.spark.SparkCatalog') \
.config('spark.sql.catalog.opencatalog.type', 'rest') \
.config('spark.sql.catalog.opencatalog.uri','https://<open_catalog_account_identifier>.snowflakecomputing.com/polaris/api/catalog') \
.config('spark.sql.catalog.opencatalog.header.X-Iceberg-Access-Delegation','vended-credentials') \
.config('spark.sql.catalog.opencatalog.token','<access_token>') \
.config('spark.sql.catalog.opencatalog.warehouse','<catalog_name>') \
.config('spark.sql.catalog.opencatalog.client.region','<target_s3_region>') \
.getOrCreate()
Exemples
Cette section contient des exemples de connexion à Open Catalog à l’aide de Spark :
[Exemple 1 : Se connecter (S3)] (#example-1-connect-s3)
[Exemple 2 : Se connecter (Cloud Storage de Google)] (#example-2-connect-cloud-storage-from-google)
[Exemple 3 : Se connecter (Azure)] (#example-3-connect-azure)
Exemple 1 : Se connecter (S3)
Consultez :
Se connecter à l’aide de l’actualisation automatique (S3)
import pyspark
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName('iceberg_lab') \
.config('spark.jars.packages', 'org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.4.1,software.amazon.awssdk:bundle:2.20.160') \
.config('spark.sql.extensions', 'org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions') \
.config('spark.sql.defaultCatalog', 'opencatalog') \
.config('spark.sql.catalog.opencatalog', 'org.apache.iceberg.spark.SparkCatalog') \
.config('spark.sql.catalog.opencatalog.type', 'rest') \
.config('spark.sql.catalog.opencatalog.uri','https://ab12345.snowflakecomputing.com/polaris/api/catalog') \
.config('spark.sql.catalog.opencatalog.header.X-Iceberg-Access-Delegation','vended-credentials') \
.config('spark.sql.catalog.opencatalog.warehouse','Catalog1') \
.config('spark.sql.catalog.opencatalog.rest.auth.type','oauth2') \
.config('spark.sql.catalog.opencatalog.oauth2-server-uri','your-tenant.region.auth0.com') \
.config('spark.sql.catalog.opencatalog.credential','11111111111111111111111111111111:222222222222222222222222222222222222222222222222222222222222222222') \
.config('spark.sql.catalog.opencatalog.scope','SESSION:ROLE:DATA_ENG') \
.config('spark.sql.catalog.opencatalog.audience','https://ab12345.snowflakecomputing.com') \
.getOrCreate()
Se connecter à l’aide d’un jeton d’accès (S3)
import pyspark
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName('iceberg_lab') \
.config('spark.jars.packages', 'org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.4.1,software.amazon.awssdk:bundle:2.20.160') \
.config('spark.sql.extensions', 'org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions') \
.config('spark.sql.defaultCatalog', 'opencatalog') \
.config('spark.sql.catalog.opencatalog', 'org.apache.iceberg.spark.SparkCatalog') \
.config('spark.sql.catalog.opencatalog.type', 'rest') \
.config('spark.sql.catalog.opencatalog.uri','https://ab12345.snowflakecomputing.com/polaris/api/catalog') \
.config('spark.sql.catalog.opencatalog.header.X-Iceberg-Access-Delegation','vended-credentials') \
.config('spark.sql.catalog.opencatalog.token','0000000000000000000000000001111111111111111111111111111111111111111111') \
.config('spark.sql.catalog.opencatalog.warehouse','Catalog1') \
.getOrCreate()
Exemple 2 : Se connecter (Cloud Storage de Google)
Consultez :
[Se connecter à l’aide de l’actualisation automatique (Cloud Storage de Google)] (#connect-by-using-automatic-refresh-cloud-storage-from-google)
[Se connecter à l’aide d’un jeton d’accès (Cloud Storage de Google)] (#connect-by-using-access-token-cloud-storage-from-google)
Se connecter à l’aide de l’actualisation automatique (Cloud Storage de Google)
import pyspark
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName('iceberg_lab') \
.config('spark.jars.packages', 'org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.4.1,org.apache.iceberg:iceberg-gcp-bundle:1.5.2') \
.config('spark.sql.extensions', 'org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions') \
.config('spark.sql.defaultCatalog', 'opencatalog') \
.config('spark.sql.catalog.opencatalog', 'org.apache.iceberg.spark.SparkCatalog') \
.config('spark.sql.catalog.opencatalog.type', 'rest') \
.config('spark.sql.catalog.opencatalog.uri','https://ab12345.snowflakecomputing.com/polaris/api/catalog') \
.config('spark.sql.catalog.opencatalog.header.X-Iceberg-Access-Delegation','vended-credentials') \
.config('spark.sql.catalog.opencatalog.warehouse','Catalog1') \
.config('spark.sql.catalog.opencatalog.rest.auth.type','oauth2') \
.config('spark.sql.catalog.opencatalog.oauth2-server-uri','your-tenant.region.auth0.com') \
.config('spark.sql.catalog.opencatalog.credential','11111111111111111111111111111111:222222222222222222222222222222222222222222222222222222222222222222') \
.config('spark.sql.catalog.opencatalog.scope','SESSION:ROLE:DATA_ENG') \
.config('spark.sql.catalog.opencatalog.audience','https://ab12345.snowflakecomputing.com') \
.getOrCreate()
Se connecter à l’aide d’un jeton d’accès (Cloud Storage de Google)
import pyspark
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName('iceberg_lab') \
.config('spark.jars.packages', 'org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.4.1,org.apache.iceberg:iceberg-gcp-bundle:1.5.2') \
.config('spark.sql.extensions', 'org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions') \
.config('spark.sql.defaultCatalog', 'opencatalog') \
.config('spark.sql.catalog.opencatalog', 'org.apache.iceberg.spark.SparkCatalog') \
.config('spark.sql.catalog.opencatalog.type', 'rest') \
.config('spark.sql.catalog.opencatalog.uri','https://ab12345.snowflakecomputing.com/polaris/api/catalog') \
.config('spark.sql.catalog.opencatalog.header.X-Iceberg-Access-Delegation','vended-credentials') \
.config('spark.sql.catalog.opencatalog.token','0000000000000000000000000001111111111111111111111111111111111111111111') \
.config('spark.sql.catalog.opencatalog.warehouse','Catalog1') \
.getOrCreate()
Exemple 3 : Se connecter (Azure)
Consultez :
Se connecter à l’aide de l’actualisation automatique (Azure)
import pyspark
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName('iceberg_lab') \
.config('spark.jars.packages', 'org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.4.1,org.apache.iceberg:iceberg-azure-bundle:1.5.2') \
.config('spark.sql.extensions', 'org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions') \
.config('spark.sql.defaultCatalog', 'opencatalog') \
.config('spark.sql.catalog.opencatalog', 'org.apache.iceberg.spark.SparkCatalog') \
.config('spark.sql.catalog.opencatalog.type', 'rest') \
.config('spark.sql.catalog.opencatalog.uri','https://ab12345.snowflakecomputing.com/polaris/api/catalog') \
.config('spark.sql.catalog.opencatalog.header.X-Iceberg-Access-Delegation','vended-credentials') \
.config('spark.sql.catalog.opencatalog.warehouse','Catalog1') \
.config('spark.sql.catalog.opencatalog.rest.auth.type','oauth2') \
.config('spark.sql.catalog.opencatalog.oauth2-server-uri','your-tenant.region.auth0.com') \
.config('spark.sql.catalog.opencatalog.credential','11111111111111111111111111111111:222222222222222222222222222222222222222222222222222222222222222222') \
.config('spark.sql.catalog.opencatalog.scope','SESSION:ROLE:DATA_ENG') \
.config('spark.sql.catalog.opencatalog.audience','https://ab12345.snowflakecomputing.com') \
.getOrCreate()
Se connecter à l’aide d’un jeton d’accès (Azure)
import pyspark
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName('iceberg_lab') \
.config('spark.jars.packages', 'org.apache.iceberg:iceberg-spark-runtime-3.5_2.12:1.4.1,org.apache.iceberg:iceberg-azure-bundle:1.5.2') \
.config('spark.sql.extensions', 'org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions') \
.config('spark.sql.defaultCatalog', 'opencatalog') \
.config('spark.sql.catalog.opencatalog', 'org.apache.iceberg.spark.SparkCatalog') \
.config('spark.sql.catalog.opencatalog.type', 'rest') \
.config('spark.sql.catalog.opencatalog.uri','https://ab12345.snowflakecomputing.com/polaris/api/catalog') \
.config('spark.sql.catalog.opencatalog.header.X-Iceberg-Access-Delegation','vended-credentials') \
.config('spark.sql.catalog.opencatalog.token','0000000000000000000000000001111111111111111111111111111111111111111111') \
.config('spark.sql.catalog.opencatalog.warehouse','Catalog1') \
.getOrCreate()
Vérification de la connexion à Open Catalog
Pour vérifier que Spark est connecté à Open Catalog, répertoriez les espaces de noms du catalogue. Pour plus d’informations, voir Référencement d’espaces de noms.