Share via


Gedeelde Azure Synapse Analytics-metagegevenstabellen

Met Azure Synapse Analytics kunnen de verschillende rekenkundige engines van de werkruimte databases en tabellen delen tussen de Apache Spark-pools en de serverloze SQL-pool.

Zodra een database is gemaakt door een Spark-taak, kunt u er tabellen in maken met Spark die Parquet, Delta of CSV gebruiken als opslagindeling. Tabelnamen worden geconverteerd naar kleine letters en moeten worden opgevraagd met behulp van de naam van het kleine hoofdlettergebruik. Deze tabellen zijn direct beschikbaar voor het uitvoeren van query's door een Spark-pool van de Azure Synapse-werkruimte. Ze kunnen ook worden gebruikt vanuit een van de Spark-taken waarvoor machtigingen gelden.

De door Spark gemaakte, beheerde en externe tabellen worden ook beschikbaar gemaakt als externe tabellen met dezelfde naam in de bijbehorende gesynchroniseerde database in de serverloze SQL-pool. In Exposing a Spark table in SQL (Een Spark-tabel in SQL weergeven) vindt u meer informatie over tabelsynchronisatie.

Omdat de tabellen asynchroon worden gesynchroniseerd met een serverloze SQL-pool, is er een kleine vertraging totdat ze worden weergegeven.

Een met Spark gemaakte tabel beheren

Gebruik Spark voor het beheren van met Spark gemaakte databases. U kunt een database bijvoorbeeld verwijderen via een serverloze Apache Spark-pooltaak en er tabellen in maken vanuit Spark.

Objecten in gesynchroniseerde databases kunnen niet worden gewijzigd vanuit een serverloze SQL-pool.

Een Spark-tabel beschikbaar maken in SQL

Gedeelde Spark-tabellen

Spark biedt twee typen tabellen die Azure Synapse automatisch beschikbaar maakt in SQL:

  • Beheerde tabellen

    Spark biedt veel opties voor het opslaan van gegevens in beheerde tabellen, zoals TEXT, CSV, JSON, JDBC, PARQUET, ORC, HIVE, DELTA en LIBSVM. Deze bestanden worden normaal gesproken opgeslagen in de map warehouse waarin de gegevens van de beheerde tabel worden opgeslagen.

  • Externe tabellen

    Spark biedt ook manieren om externe tabellen te maken op basis van bestaande gegevens, door de optie LOCATION op te geven of de Hive-indeling te gebruiken. Dergelijke externe tabellen kunnen verschillende gegevensindelingen hebben, waaronder Parquet.

Azure Synapse deelt momenteel alleen beheerde en externe Spark-tabellen die hun gegevens opslaan in Parquet-, DELTA- of CSV-indeling met de SQL-engines. Tabellen die worden ondersteund door andere indelingen, worden niet automatisch gesynchroniseerd. U kunt dergelijke tabellen mogelijk expliciet als een externe tabel in uw eigen SQL-database synchroniseren als de SQL-engine de onderliggende indeling van de tabel ondersteunt.

Notitie

Op dit moment worden alleen Parquet- en CSV-indelingen volledig ondersteund in een serverloze SQL-pool. Spark Delta-tabellen zijn ook beschikbaar in de serverloze SQL-pool, maar deze functie is in openbare preview. Externe tabellen die zijn gemaakt in Spark zijn niet beschikbaar in toegewezen SQL-pooldatabases.

Spark-tabellen delen

De deelbaar beheerde en externe Spark-tabellen die worden weergegeven in de SQL-engine als externe tabellen met de volgende eigenschappen:

  • De gegevensbron van de externe SQL-tabel is de gegevensbron die de locatiemap van de Spark-tabel voorstelt.
  • De bestandsindeling van de externe SQL-tabel is Parquet, Delta of CSV.
  • De referenties voor toegang van de externe SQL-tabel zijn passthrough.

Aangezien alle Spark-tabelnamen geldige SQL-tabelnamen zijn en alle Spark-kolomnamen geldige SQL-kolomnamen zijn, worden de Spark-tabelnamen en -kolomnamen gebruikt voor de externe SQL-tabel.

Spark-tabellen bieden andere gegevenstypen dan de Synapse SQL-engines. In de volgende tabel worden de gegevenstypen van de Spark-tabel toegewezen aan de SQL-typen:

Spark-gegevenstype SQL-gegevenstype Opmerkingen
LongType, , longbigint bigint Spark: LongType vertegenwoordigt 8-byte ondertekende gehele getallen.
SQL: Zie int, bigint, smallint en tinyint.
BooleanType, boolean bit (Parquet), varchar(6) (CSV) Spark: Booleaanse waarde.
SQL: Zie [/sql/t-sql/data-types/bit-transact-sql).
DecimalType, , , decimaldecnumeric decimal Spark: DecimalType vertegenwoordigt willekeurige decimale getallen die zijn ondertekend met willekeurige precisie. Intern ondersteund door java.math.BigDecimal. Een BigDecimale bestaat uit een willekeurig precisie-geheel getal dat niet-geschaald is en een 32-bits geheel getalschaal.
SQL: Vaste precisie en schaalnummers. Wanneer maximale precisie wordt gebruikt, zijn geldige waarden van - 10^38 +1 tot en met 10^38 - 1. De ISO-synoniemen voor decimalen zijn dec en dec(p, s). numeriek is functioneel identiek aan decimaal. Zie decimaal en numeriek.
IntegerType, , Integerint int Spark IntegerType vertegenwoordigt 4-byte ondertekende gehele getallen.
SQL: Zie int, bigint, smallint en tinyint.
ByteType, , Bytetinyint smallint Spark: ByteType vertegenwoordigt gehele getallen van 1 byte met teken [-128 tot 127] en ShortType vertegenwoordigt gehele getallen met 2 bytetekens [-32768 tot 32767].
SQL: Tinyint vertegenwoordigt 1-byte ondertekende gehele getallen [0, 255] en smallint vertegenwoordigt 2-byte ondertekende gehele getallen [-32768, 32767]. Zie int, bigint, smallint en tinyint.
ShortType, , Shortsmallint smallint Hetzelfde als hierboven.
DoubleType, Double float Spark: DoubleType vertegenwoordigt 8-byte drijvendekommanummers met dubbele precisie. SQL: Zie float en real.
FloatType, , floatreal real Spark: FloatType vertegenwoordigt 4-byte drijvendekommanummers met dubbele precisie. SQL: Zie float en real.
DateType, date date Spark: DateType vertegenwoordigt waarden die bestaan uit waarden van velden jaar, maand en dag, zonder een tijdzone.
SQL: Zie datum.
TimestampType, timestamp datetime2 Spark: TimestampType vertegenwoordigt waarden die bestaan uit waarden van velden jaar, maand, dag, uur, minuut en seconde, met de lokale tijdzone van de sessie. De tijdstempelwaarde vertegenwoordigt een absoluut tijdstip.
SQL: Zie datetime2.
char char
StringType, , Stringvarchar Varchar(n) Spark: StringType vertegenwoordigt tekenreekswaarden. VarcharType(n) is een variant van StringType die een lengtebeperking heeft. Het schrijven van gegevens mislukt als de invoertekenreeks de lengtelimiet overschrijdt. Dit type kan alleen worden gebruikt in het tabelschema, niet in functies/operators.
CharType(n) is een variant van VarcharType(n) die een vaste lengte heeft. Leeskolom van het type CharType(n) retourneert altijd tekenreekswaarden van lengte n. Met de vergelijking van charType(n) wordt de korte kolom vergeleken met de langere lengte.
SQL: Als er een lengte van Spark is opgegeven, wordt n in varchar(n) ingesteld op die lengte. Als het een gepartitioneerde kolom is, kan n maximaal 2048 zijn. Anders is het varchar(max). Zie char en varchar.
Gebruik deze met sortering Latin1_General_100_BIN2_UTF8.
BinaryType, binary varbinary(n) SQL: Als er een lengte is opgegeven van Spark, n wordt in Varbinary(n) ingesteld op die lengte. Als het een gepartitioneerde kolom is, kan n maximaal 2048 zijn. Anders is het Varbinary(max). Zie binair en varbinary.
array, , mapstruct varchar(max) SQL: Serialiseert in JSON met sortering Latin1_General_100_BIN2_UTF8. Zie JSON-gegevens.

Notitie

Sortering op databaseniveau is Latin1_General_100_CI_AS_SC_UTF8.

Beveiligingsmodel

De Spark-databases en -tabellen en hun gesynchroniseerde weergaven in de SQL-engine worden beveiligd op het onderliggende opslagniveau. Omdat deze momenteel geen machtigingen hebben voor de objecten zelf, kunnen de objecten worden weergegeven in de objectverkenner.

De beveiligingsprincipal die een beheerde tabel maakt, wordt beschouwd als de eigenaar van die tabel en beschikt over alle rechten voor de tabel en de onderliggende mappen en bestanden. Daarnaast wordt de eigenaar van de database automatisch mede-eigenaar van de tabel.

Als u een externe Spark- of SQL-tabel met verificatiedoorvoer maakt, worden de gegevens alleen beveiligd op map- en bestandsniveau. Als iemand een query uitvoert op dit type externe tabel, wordt de inzender van de beveiligingsidentiteit van de query doorgegeven aan het bestandssysteem, waarna de toegangsrechten van die inzender worden gecontroleerd.

Zie Gedeelde database van Azure Synapse Analyticsvoor meer informatie over het instellen van machtigingen voor de mappen en bestanden.

Voorbeelden

Een beheerde tabel maken in Spark en query's uitvoeren op een serverloze SQL-pool

In dit scenario hebt u een Spark-database met de naam mytestdb. Zie Een Spark-database maken en verbinden met een serverloze SQL-pool.

Maak een beheerde Spark-tabel met SparkSQL door de volgende opdracht uit te voeren:

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

Met deze opdracht maakt u de tabel myparquettable in de database mytestdb. Tabelnamen worden geconverteerd naar kleine letters. Na een korte vertraging wordt de tabel in uw serverloze SQL-pool weergegeven. Voer bijvoorbeeld de volgende instructie uit vanuit uw serverloze SQL-pool.

    USE mytestdb;
    SELECT * FROM sys.tables;

Controleer of myparquettable is opgenomen in de resultaten.

Notitie

Een tabel die geen gebruikmaakt van Delta, Parquet of CSV als opslagindeling, wordt niet gesynchroniseerd.

Voeg vervolgens enkele waarden in de tabel in vanuit Spark, bijvoorbeeld met de volgende C# Spark-instructies in een C#-notebook:

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");

Nu kunt u de gegevens van uw serverloze SQL-pool als volgt lezen:

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

Als het goed is, wordt de volgende rij als resultaat weergegeven:

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

Een externe tabel maken in Spark en query's uitvoeren op een serverloze SQL-pool

In dit voorbeeld maken we een externe Spark-tabel over de Parquet-gegevensbestanden die zijn gemaakt in het vorige voorbeeld voor de beheerde tabel.

Bijvoorbeeld met SparkSQL-uitvoering:

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

Vervang de tijdelijke aanduiding <storage-name> door de naam van het ADLS Gen2-opslagaccount dat u gebruikt, <fs> door de bestandsnaam die u gebruikt en de tijdelijke aanduiding <synapse_ws> door de naam van de Azure Synapse-werkruimte die u gebruikt om dit voorbeeld uit te voeren.

Met het vorige voorbeeld maakt u de tabel myextneralparquettable in de databasemytestdb. Na een korte vertraging wordt de tabel in uw serverloze SQL-pool weergegeven. Voer bijvoorbeeld de volgende instructie uit vanuit uw serverloze SQL-pool.

USE mytestdb;
SELECT * FROM sys.tables;

Controleer of myexternalparquettable is opgenomen in de resultaten.

Nu kunt u de gegevens van uw serverloze SQL-pool als volgt lezen:

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

Als het goed is, wordt de volgende rij als resultaat weergegeven:

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

Volgende stappen