Partager via


Tables de métadonnées partagées Azure Synapse Analytics

Azure Synapse Analytics permet aux différents moteurs de calcul d’espace de travail de partager des bases de données et des tables entre ses pools Apache Spark et le pool SQL serverless.

Une fois qu’une base de données a été créée par un travail Spark, vous pouvez y créer des tables avec Spark qui utilisent Parquet, Delta ou CSV comme format de stockage. Les noms de table sont convertis en minuscules et doivent être interrogés en utilisant le nom en minuscules. Ces tables sont immédiatement disponibles pour l’interrogation par n’importe lequel des pools Spark de l’espace de travail Azure Synapse. Elles peuvent également être utilisées à partir de n’importe quel travail Spark, soumis à certaines autorisations.

Les tables Spark créées, gérées et externes sont également mises à disposition comme tables externes sous le même nom dans la base de données synchronisée correspondante dans le pool SQL serverless. Exposition d’une table Spark dans SQL fournit plus de détails sur la synchronisation des tables.

Comme elles sont synchronisées avec le pool SQL serverless de façon asynchrone, les tables apparaissent après un petit délai.

Gérer une table créée avec Spark

Utilisez Spark pour gérer les bases de données créées avec Spark. Par exemple, supprimez-la via un travail de pool Apache Spark serverless et créez-y des tables depuis Spark.

Les objets des bases de données synchronisées ne peuvent pas être modifiés à partir du pool SQL sans serveur.

Exposer une table Spark dans SQL

Tables Spark partagées

Spark fournit deux types de tables qu’Azure Synapse expose automatiquement dans SQL :

  • Tables gérées

    Spark offre de nombreuses options pour le stockage des données dans des tables gérées, telles que TEXT, CSV, JSON, JDBC, PARQUET, ORC, HIVE, DELTA et LIBSVM. Ces fichiers sont normalement stockés dans le répertoire warehouse dans lequel sont stockées les données des tables gérées.

  • Tables externes

    Spark fournit également des moyens de créer des tables externes sur des données existantes, soit en spécifiant l’option LOCATION, soit en utilisant le format Hive. Ces tables externes peuvent être de divers formats de données, notamment Parquet.

Azure Synapse partage actuellement uniquement les tables Spark gérées et externes qui stockent leurs données au format Parquet, Delta ou CSV avec les moteurs SQL. Les tableaux pris en charge par d’autres formats ne sont pas automatiquement synchronisés. Vous pouvez synchroniser vous-même explicitement ces tables en tant que table externe dans votre propre base de données SQL si le moteur SQL prend en charge le format sous-jacent de la table.

Remarque

Actuellement, seuls les formats Parquet et CSV sont entièrement pris en charge dans un pool SQL serverless. Les tables Delta Spark sont également disponibles dans le pool SQL serverless, mais cette fonctionnalité est en préversion publique. Les tables externes créées dans Spark ne sont pas disponibles dans les bases de données de pool SQL dédiées.

Partager des tables Spark

Les tables Spark gérées et externes partageables sont exposées dans le moteur SQL en tant que tables externes avec les propriétés suivantes :

  • La source de données de la table externe SQL est la source de données représentant le dossier d’emplacement de la table Spark.
  • Le format de fichier de la table externe SQL est Parquet, Delta ou CSV.
  • Les informations d’identification d’accès de la table externe SQL sont directes.

Étant donné que tous les noms de tables Spark sont des noms de tables SQL valides et que tous les noms de colonnes Spark sont des noms de colonnes SQL valides, les noms de tables et de colonnes Spark sont utilisés pour la table externe SQL.

Les tables Spark fournissent des types de données différents de ceux des moteurs SQL Synapse. Le tableau suivant mappe les types de données de table Spark aux types SQL :

Type de données Spark Type de données SQL Commentaires
LongType, long, bigint bigint Spark : LongType représente des nombres entiers signés de 8 octets.
SQL : Consultez int, bigint, smallint et tinyint.
BooleanType, boolean bit (Parquet), varchar(6) (CSV) Spark : Booléen.
SQL : Consultez [/sql/t-sql/data-types/bit-transact-sql).
DecimalType, decimal, dec, numeric decimal Spark : DecimalType représente des nombres décimaux entiers de précision arbitraire. Soutenu en interne par java.math.BigDecimal. Un BigDecimal est constitué d’une valeur entière de précision arbitraire non mise à l’échelle et d’une échelle d’entier 32 bits.
SQL : nombres de précision et d’échelle fixes. Lorsque la précision maximale est utilisée, les valeurs valides sont comprises entre - 10^38 +1 et 10^38 - 1. Les synonymes ISO de decimal sont dec et dec(p, s) . numeric est fonctionnellement identique à decimal. Consultez decimal et numeric.
IntegerType, Integer, int int Spark IntegerType représente des nombres entiers signés de 4 octets.
SQL : Consultez int, bigint, smallint et tinyint.
ByteType, Byte, tinyint smallint Spark : ByteType représente des nombres entiers signés sur 1 octet [-128 à 127] et ShortType représente des nombres entiers signés sur 2 octets [-32768 à 32767].
SQL : Tinyint représente des nombres entiers signés sur 1 octet [0, 255] et smallint représente des nombres entiers signés sur 2 octets [-32768, 32767]. Consultez int, bigint, smallint et tinyint.
ShortType, Short, smallint smallint Identique à ce qui précède.
DoubleType, Double float Spark : DoubleType représente des nombres à virgule flottante double précision de huit octets. SQL : Consultez float et real.
FloatType, float, real real Spark : FloatType représente des nombres à virgule flottante double précision de quatre octets. SQL : Consultez float et real.
DateType, date date Spark : DateType représente des valeurs comprenant les valeurs des champs année, mois et jour, sans fuseau horaire.
SQL : Consultez date.
TimestampType, timestamp datetime2 Spark : TimestampType représente les valeurs des champs Année, Mois, Jour, Heure, Minute et Seconde, avec le fuseau horaire local de la session. La valeur d’horodatage représente un point absolu dans le temps.
SQL : Consultez datetime2.
char char
StringType, String, varchar Varchar(n) Spark: StringType représente des valeurs de chaînes de caractères. VarcharType(n) est une variante de StringType qui comporte une limite de longueur. L’écriture de données échoue si la chaîne d’entrée dépasse la limite de longueur. Ce type peut uniquement être utilisé dans un schéma de table. Il ne peut pas être utilisé dans des fonctions ou des opérateurs.
CharType(n) est une variante de VarcharType(n) dont la longueur est fixe. La lecture d’une colonne de type CharType(n) retourne toujours des valeurs de chaîne de longueur n. La comparaison des colonnes CharType(n) fera correspondre la longueur la plus courte à celle la plus longue.
SQL : S’il existe une longueur fournie à partir de Spark, n dans varchar(n) sera défini sur cette longueur. S'il s'agit d'une colonne partitionnée, n peut être au maximum 2048. Sinon, il va s’agir de varchar(max). Consultez char et varchar.
Utilisez-le avec le classement Latin1_General_100_BIN2_UTF8.
BinaryType, binary varbinary(n) SQL : S’il existe une longueur fournie à partir de Spark, n dans Varbinary(n) sera défini sur cette longueur. S'il s'agit d'une colonne partitionnée, n peut être au maximum 2048. Sinon, il va s’agir de Varbinary(max). Consultez binary et varbinary.
array, map, struct varchar(max) SQL : Sérialise en JSON avec le classement Latin1_General_100_BIN2_UTF8. Consultez Données JSON.

Notes

Le classement au niveau de la base de données est Latin1_General_100_CI_AS_SC_UTF8.

Modèle de sécurité

Les bases de données et tables Spark, ainsi que leurs représentations synchronisées dans le moteur SQL, seront sécurisées au niveau du stockage sous-jacent. Comme ils ne disposent pas actuellement d’autorisations sur les objets eux-mêmes, les objets peuvent être vus dans l’explorateur d’objets.

Le principal de sécurité qui crée une table gérée est considéré comme le propriétaire de cette table et dispose de tous les droits sur la table ainsi que sur les dossiers et fichiers sous-jacents. En outre, le propriétaire de la base de données devient automatiquement copropriétaire de la table.

Si vous créez une table externe SQL ou Spark avec authentification directe, les données sont sécurisées uniquement au niveau des dossiers et des fichiers. Si quelqu’un interroge ce type de table externe, l’identité de sécurité de l’expéditeur de la requête est transmise au système de fichiers, qui vérifiera les droits d’accès.

Pour plus d’informations sur la façon de définir des autorisations sur les dossiers et les fichiers, consultez Base de données partagée Azure Synapse Analytics.

Exemples

Créer une table gérée dans Spark et interroger à partir du pool SQL serverless

Dans ce scénario, vous disposez d’une base de données Spark nommée mytestdb. Consultez Créer une base de données Spark et s’y connecter avec le pool SQL serverless.

Créez une table Spark gérée avec SparkSQL en exécutant la commande suivante :

    CREATE TABLE mytestdb.myparquettable(id int, name string, birthdate date) USING Parquet

Cette commande crée la table myparquettable dans la base de données mytestdb. Les noms de table sont convertis en minuscules. Après un bref délai, vous pouvez voir la table dans votre pool SQL serverless. Exécutez par exemple l’instruction suivante à partir de votre pool SQL serverless.

    USE mytestdb;
    SELECT * FROM sys.tables;

Vérifiez que myparquettable est inclus dans les résultats.

Notes

Une table qui n’utilise pas Parquet, Delta ou CSV comme format de stockage n’est pas synchronisée.

Ensuite, insérez des valeurs dans la table à partir de Spark, par exemple avec les instructions Spark C# suivantes dans un notebook C# :

using Microsoft.Spark.Sql.Types;

var data = new List<GenericRow>();

data.Add(new GenericRow(new object[] { 1, "Alice", new Date(2010, 1, 1)}));
data.Add(new GenericRow(new object[] { 2, "Bob", new Date(1990, 1, 1)}));

var schema = new StructType
    (new List<StructField>()
        {
            new StructField("id", new IntegerType()),
            new StructField("name", new StringType()),
            new StructField("birthdate", new DateType())
        }
    );

var df = spark.CreateDataFrame(data, schema);
df.Write().Mode(SaveMode.Append).InsertInto("mytestdb.myparquettable");

Vous pouvez maintenant lire les données de votre pool SQL serverless comme suit :

SELECT * FROM mytestdb.myparquettable WHERE name = 'Alice';

Vous devez obtenir la ligne suivante comme résultat :

id | name | birthdate
---+-------+-----------
1 | Alice | 2010-01-01

Créer une table externe dans Spark et interroger à partir du pool SQL serverless

Dans cet exemple, nous allons créer une table Spark externe sur les fichiers de données Parquet créés dans l'exemple précédent pour la table gérée.

Par exemple, avec SparkSQL, exécutez :

CREATE TABLE mytestdb.myexternalparquettable
    USING Parquet
    LOCATION "abfss://<storage-name>.dfs.core.windows.net/<fs>/synapse/workspaces/<synapse_ws>/warehouse/mytestdb.db/myparquettable/"

Remplacez l’espace réservé <storage-name> par le nom du compte de stockage ADLS Gen2 que vous utilisez, <fs> par le nom du système de fichiers que vous utilisez et l’espace réservé <synapse_ws> par le nom de l’espace de travail Azure Synapse que vous utilisez pour exécuter cet exemple.

L’exemple précédent crée la table myextneralparquettable dans la base de données mytestdb. Après un bref délai, vous pouvez voir la table dans votre pool SQL serverless. Exécutez par exemple l’instruction suivante à partir de votre pool SQL serverless.

USE mytestdb;
SELECT * FROM sys.tables;

Vérifiez que myexternalparquettable est inclus dans les résultats.

Vous pouvez maintenant lire les données de votre pool SQL serverless comme suit :

SELECT * FROM mytestdb.dbo.myexternalparquettable WHERE name = 'Alice';

Vous devez obtenir la ligne suivante comme résultat :

id | name | birthdate
---+-------+-----------
1 | Alice | 2010-01-01

Étapes suivantes