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 expliciet synchroniseren als een externe tabel in uw eigen SQL-database 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 , , long bigint |
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 , , , decimal dec numeric |
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 , , Integer int |
int |
Spark IntegerType vertegenwoordigt 4 byte ondertekende gehele getallen. SQL: Zie int, bigint, smallint en tinyint. |
ByteType , , Byte tinyint |
smallint |
Spark: ByteType vertegenwoordigt 1 byte ondertekende gehele getallen [-128 tot 127] en ShortType vertegenwoordigt 2 byte ondertekende gehele getallen [-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 , , Short smallint |
smallint |
Hetzelfde als hierboven. |
DoubleType , Double |
float |
Spark: DoubleType vertegenwoordigt 8-byte drijvendekommanummers met dubbele precisie. SQL: Zie float en real. |
FloatType , , float real |
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 , , String varchar |
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 , , map struct |
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 de gesynchroniseerde weergaven in de SQL-engine worden beveiligd op het onderliggende opslagniveau. Omdat ze 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.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 in het vorige voorbeeld voor de beheerde tabel zijn gemaakt.
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