Lire et écrire des données depuis Snowflake
Databricks dispose d’un connecteur Snowflake dans le Databricks Runtime pour permettre la lecture et l’écriture de données depuis Snowflake.
Expérimental
La documentation sur la fédération des query héritées a été retirée et pourrait ne pas être mise à jour. Les configurations mentionnées dans ce contenu ne sont ni officiellement approuvées ni testées par Databricks. Si la Lakehouse Federation prend en charge votre base de données source, Databricks recommande d'utiliser cette dernière.
Interroger une table Snowflake dans Databricks
Vous pouvez configurer une connexion à Snowflake, puis query les données. Avant de commencer, vérifiez la version de Databricks Runtime sur laquelle votre cluster s'exécute. Le code suivant inclut un exemple de syntaxe en Python, SQL et Scala.
- Python
- SQL
- Scala
# The following example applies to Databricks Runtime 11.3 LTS and above.
snowflake_table = (spark.read
.format("snowflake")
.option("host", "hostname")
.option("port", "port") # Optional - will use default port 443 if not specified.
.option("user", "username")
.option("password", "password")
.option("sfWarehouse", "warehouse_name")
.option("database", "database_name")
.option("schema", "schema_name") # Optional - will use default schema "public" if not specified.
.option("dbtable", "table_name")
.load()
)
# The following example applies to Databricks Runtime 10.4 and below.
snowflake_table = (spark.read
.format("snowflake")
.option("dbtable", table_name)
.option("sfUrl", database_host_url)
.option("sfUser", username)
.option("sfPassword", password)
.option("sfDatabase", database_name)
.option("sfSchema", schema_name)
.option("sfWarehouse", warehouse_name)
.load()
)
/* The following example applies to Databricks Runtime 11.3 LTS and above. */
DROP TABLE IF EXISTS snowflake_table;
CREATE TABLE snowflake_table
USING snowflake
OPTIONS (
host '<hostname>',
port '<port>', /* Optional - will use default port 443 if not specified. */
user '<username>',
password '<password>',
sfWarehouse '<warehouse_name>',
database '<database-name>',
schema '<schema-name>', /* Optional - will use default schema "public" if not specified. */
dbtable '<table-name>'
);
SELECT * FROM snowflake_table;
/* The following example applies to Databricks Runtime 10.4 LTS and below. */
DROP TABLE IF EXISTS snowflake_table;
CREATE TABLE snowflake_table
USING snowflake
OPTIONS (
dbtable '<table-name>',
sfUrl '<database-host-url>',
sfUser '<username>',
sfPassword '<password>',
sfDatabase '<database-name>',
sfSchema '<schema-name>',
sfWarehouse '<warehouse-name>'
);
SELECT * FROM snowflake_table;
# The following example applies to Databricks Runtime 11.3 LTS and above.
val snowflake_table = spark.read
.format("snowflake")
.option("host", "hostname")
.option("port", "port") /* Optional - will use default port 443 if not specified. */
.option("user", "username")
.option("password", "password")
.option("sfWarehouse", "warehouse_name")
.option("database", "database_name")
.option("schema", "schema_name") /* Optional - will use default schema "public" if not specified. */
.option("dbtable", "table_name")
.load()
# The following example applies to Databricks Runtime 10.4 and below.
val snowflake_table = spark.read
.format("snowflake")
.option("dbtable", table_name)
.option("sfUrl", database_host_url)
.option("sfUser", username)
.option("sfPassword", password)
.option("sfDatabase", database_name)
.option("sfSchema", schema_name)
.option("sfWarehouse", warehouse_name)
.load()
Écrire des données vers Snowflake
Vous pouvez écrire un Spark DataFrame dans une table Snowflake en utilisant le même format de snowflake source de données avec df.write. Vous pouvez également émettre des instructions INSERT INTO et CTAS sur une table adossée à Snowflake.
- Python
- SQL
sf_options = {
"host": "<hostname>",
"sfDatabase": "<database-name>",
"sfSchema": "<schema-name>",
"sfWarehouse": "<warehouse-name>",
"sfRole": "<role-name>",
"sfUser": "<username>",
"sfPassword": "<password>",
"dbtable": "<table-name>",
}
(df.write
.format("snowflake")
.options(**sf_options)
.mode("append")
.save())
CREATE TABLE snowflake_target
USING snowflake
OPTIONS (
host '<hostname>',
sfUser '<username>',
sfPassword '<password>',
sfDatabase '<database-name>',
sfSchema '<schema-name>',
sfWarehouse '<warehouse-name>',
sfRole '<role-name>',
dbtable '<table-name>'
) AS SELECT * FROM source_view;
Écritures sur compute serverless
Sur Spark Serverless et Databricks SQL, le connecteur Snowflake prend en charge uniquement les options listées dans le tableau suivant.
Option classique de Databricks Runtime | Équivalent Serverless |
|---|---|
|
|
|
|
|
|
| Non pris en charge sur serverless. Déplacez la logique dans les procédures stockées, les tâches ou les jobs planifiés de Snowflake. |
| Non pris en charge sur serverless. |
Exemple de Notebook : Connecteur Snowflake pour Spark
Les notebooks suivants fournissent des exemples simples d'écriture et de lecture de données depuis Snowflake. Pour plus de détails, consultez le Connecteur Snowflake pour Spark.
Évitez d'exposer votre nom d'utilisateur et votre mot de passe Snowflake dans les Notebooks en utilisant les Secrets, qui sont présentés dans les Notebooks.
Notebook Python Snowflake
Exemple de Notebook : enregistrer les résultats d'entraînement du modèle dans Snowflake
Le notebook suivant présente les meilleures pratiques d'utilisation du connecteur Snowflake pour Spark. Il écrit des données dans Snowflake, utilise Snowflake pour des manipulations de données de base, entraîne un modèle de Machine Learning (ML) dans Databricks et réécrit les résultats dans Snowflake.
Stocker les résultats de formation ML dans le notebook Snowflake
Questions fréquemment posées (FAQ)
Pourquoi les colonnes de mon Spark DataFrame n’apparaissent-elles pas dans le même ordre dans Snowflake ?
Le Connecteur Snowflake pour Spark ne respecte pas l'ordre des colonnes dans la table vers laquelle l'écriture est effectuée. Vous devez spécifier explicitement le mappage entre les colonnes DataFrame et Snowflake. Pour spécifier ce mappage, utilisez le paramètre columnmap.
Pourquoi les données INTEGER écrites dans Snowflake sont-elles relues comme DECIMAL?
Snowflake représente tous les types INTEGER en tant que NUMBER, ce qui peut entraîner un changement de type de données lorsque vous écrivez des données vers et lisez des données depuis Snowflake. Par exemple, Snowflake peut convertir les données INTEGER en DECIMAL lors de l'écriture, car INTEGER et DECIMAL sont sémantiquement équivalents dans Snowflake (voir Types de données numériques Snowflake).
Pourquoi les champs dans le schéma de ma table Snowflake sont-ils toujours en majuscules ?
Snowflake utilise des champs en majuscules par default, ce qui signifie que Snowflake convertit le schéma de table en majuscules.