SKAPA EXTERN TABELL SOM SELECT (CETAS) (Transact-SQL)
gäller för: SQL Server 2022 (16.x) och senare
Azure Synapse Analytics
Analytics Platform System (PDW)
Skapar en extern tabell och exporterar sedan, parallellt, resultatet av en Transact-SQL SELECT-instruktion.
- Azure Synapse Analytics and Analytics Platform System stöder Hadoop eller Azure Blob Storage.
- SQL Server 2022 (16.x) och senare versioner stöder
CREATE EXTERNAL TABLE AS SELECT
(CETAS) för att skapa en extern tabell och exporterar sedan, parallellt, resultatet av en Transact-SQL SELECT-instruktion till Azure Data Lake Storage (ADLS) Gen2, Azure Storage Account V2 och S3-kompatibel objektlagring.
Not
Funktionerna och säkerheten för CETAS för Azure SQL Managed Instance skiljer sig från SQL Server eller Azure Synapse Analytics. Mer information finns i Azure SQL Managed Instance-versionen av CREATE EXTERNAL TABLE AS SELECT.
Not
Funktionerna och säkerheten i CETAS för serverlösa pooler i Azure Synapse Analytics skiljer sig från SQL Server. Mer information finns i CETAS med Synapse SQL.
Transact-SQL syntaxkonventioner
Syntax
CREATE EXTERNAL TABLE { [ [ database_name . [ schema_name ] . ] | schema_name . ] table_name }
[ (column_name [ , ...n ] ) ]
WITH (
LOCATION = 'hdfs_folder' | '<prefix>://<path>[:<port>]' ,
DATA_SOURCE = external_data_source_name ,
FILE_FORMAT = external_file_format_name
[ , <reject_options> [ , ...n ] ]
)
AS <select_statement>
[;]
<reject_options> ::=
{
| REJECT_TYPE = value | percentage
| REJECT_VALUE = reject_value
| REJECT_SAMPLE_VALUE = reject_sample_value
}
<select_statement> ::=
[ WITH <common_table_expression> [ , ...n ] ]
SELECT <select_criteria>
Argument
[ [ database_name . [ schema_name ] . ] | schema_name . ] table_name
Tabellnamnet i en till tre delar som ska skapas i databasen. För en extern tabell lagrar relationsdatabasen endast tabellmetadata.
[ ( column_name [ ,... n ] ) ]
Namnet på en tabellkolumn.
PLATS
gäller för: Azure Synapse Analytics and Analytics Platform System
'hdfs_folder'**
Anger var resultatet av SELECT-instruktionen ska skrivas på den externa datakällan. Platsen är ett mappnamn och kan eventuellt innehålla en sökväg som är relativ till rotmappen för Hadoop-klustret eller Blob Storage. PolyBase skapar sökvägen och mappen om den inte redan finns.
De externa filerna skrivs till hdfs_folder
och heter QueryID_date_time_ID.format
, där ID
är en inkrementell identifierare och format
är det exporterade dataformatet. Ett exempel är QID776_20160130_182739_0.orc
.
LOCATION måste peka på en mapp och ha en avslutande /
, till exempel: aggregated_data/
.
gäller för: SQL Server 2022 (16.x) och senare
prefix://path[:port]
tillhandahåller anslutningsprotokollet (prefixet), sökvägen och eventuellt porten till den externa datakällan, där resultatet av SELECT-instruktionen skrivs.
Om målet är S3-kompatibelt objektlagring måste det först finnas en bucket, men PolyBase kan skapa undermappar om det behövs. SQL Server 2022 (16.x) stöder Azure Data Lake Storage Gen2, Azure Storage Account V2 och S3-kompatibel objektlagring. ORC-filer stöds inte för närvarande.
DATA_SOURCE = external_data_source_name
Anger namnet på det externa datakällans objekt som innehåller den plats där externa data lagras eller kommer att lagras. Platsen är antingen ett Hadoop-kluster eller en Azure Blob Storage. Om du vill skapa en extern datakälla använder du CREATE EXTERNAL DATA SOURCE (Transact-SQL).
FILE_FORMAT = external_file_format_name
Anger namnet på det externa filformatobjektet som innehåller formatet för den externa datafilen. Om du vill skapa ett externt filformat använder du CREATE EXTERNAL FILE FORMAT (Transact-SQL).
ALTERNATIV FÖR AVVISA
AVVISA-alternativ gäller inte när den här CREATE EXTERNAL TABLE AS SELECT
-instruktionen körs. I stället anges de här så att databasen kan använda dem vid ett senare tillfälle när den importerar data från den externa tabellen. När instruktionen CREATE TABLE AS SELECT senare väljer data från den externa tabellen använder databasen alternativen för att avvisa för att fastställa antalet eller procentandelen rader som inte kan importeras innan importen stoppas.
REJECT_VALUE = reject_value
Anger värdet eller procentandelen rader som inte kan importeras innan databasen stoppar importen.
REJECT_TYPE = värde | procent
Klargör om alternativet REJECT_VALUE är ett literalvärde eller en procentsats.
värde
Används om REJECT_VALUE är ett literalvärde, inte en procentandel. Databasen slutar importera rader från den externa datafilen när antalet misslyckade rader överskrider reject_value.
Om
REJECT_VALUE = 5
ochREJECT_TYPE = value
slutar databasen till exempel att importera rader efter att fem rader inte har importerats.procentsats
Används om REJECT_VALUE är en procentandel, inte ett literalvärde. Databasen slutar importera rader från den externa datafilen när den procentandelen av misslyckade rader överskrider reject_value. Procentandelen misslyckade rader beräknas med intervall. Gäller endast i dedikerade SQL-pooler när
TYPE=HADOOP
.
REJECT_SAMPLE_VALUE = reject_sample_value
Krävs när
REJECT_TYPE = percentage
. Anger antalet rader som ska importeras innan databasen beräknar om procentandelen misslyckade rader.Om till exempel REJECT_SAMPLE_VALUE = 1 000 beräknar databasen procentandelen misslyckade rader när den har försökt importera 1 000 rader från den externa datafilen. Om procentandelen misslyckade rader är mindre än reject_valueförsöker databasen läsa in ytterligare 1 000 rader. Databasen fortsätter att beräkna om procentandelen misslyckade rader när den försöker importera ytterligare 1 000 rader.
Not
Eftersom databasen beräknar procentandelen misslyckade rader med intervall kan den faktiska procentandelen misslyckade rader överskrida reject_value.
Exempel:
Det här exemplet visar hur de tre REJECT-alternativen interagerar med varandra. Om
REJECT_TYPE = percentage, REJECT_VALUE = 30, REJECT_SAMPLE_VALUE = 100
kan till exempel följande scenario inträffa:- Databasen försöker läsa in de första 100 raderna, varav 25 misslyckas och 75 lyckas.
- Procentandelen misslyckade rader beräknas som 25%, vilket är mindre än värdet för avvisande av 30%. Så det finns ingen anledning att stoppa belastningen.
- Databasen försöker läsa in de kommande 100 raderna. Den här gången lyckas 25 och 75 misslyckas.
- Procenten misslyckade rader beräknas om till 50%. Procentandelen misslyckade rader har överskridit värdet 30% avvisa.
- Belastningen misslyckas med 50% misslyckade rader efter försök att läsa in 200 rader, vilket är större än den angivna gränsen på 30%.
MED common_table_expression
Anger en tillfällig namngiven resultatuppsättning, som kallas för ett gemensamt tabelluttryck (CTE). Mer information finns i WITH common_table_expression (Transact-SQL)
VÄLJ <select_criteria>
Fyller i den nya tabellen med resultatet från en SELECT-instruktion. select_criteria är brödtexten i SELECT-instruktionen som avgör vilka data som ska kopieras till den nya tabellen. Information om SELECT-instruktioner finns i SELECT (Transact-SQL).
Not
ORDER BY-satsen i SELECT har ingen effekt på CETAS.
Kolumnalternativ
column_name [ ,... n ]
Kolumnnamn tillåter inte de kolumnalternativ som anges i CREATE TABLE. I stället kan du ange en valfri lista med ett eller flera kolumnnamn för den nya tabellen. Kolumnerna i den nya tabellen använder de namn som du anger. När du anger kolumnnamn måste antalet kolumner i kolumnlistan matcha antalet kolumner i urvalsresultatet. Om du inte anger några kolumnnamn använder den nya måltabellen kolumnnamnen i select-instruktionsresultatet.
Du kan inte ange några andra kolumnalternativ, till exempel datatyper, sortering eller nullabilitet. Vart och ett av dessa attribut härleds från resultatet av SELECT-instruktionen. Du kan dock använda SELECT-instruktionen för att ändra attributen. Ett exempel finns i Använda CETAS för att ändra kolumnattribut.
Behörigheter
För att köra det här kommandot behöver -databasanvändaren alla dessa behörigheter eller medlemskap:
- ALTER SCHEMA behörighet för det lokala schemat som innehåller den nya tabellen eller medlemskapet i den db_ddladmin fasta databasrollen.
- SKAPA TABELL behörighet eller medlemskap i den db_ddladmin fasta databasrollen.
- SELECT behörighet för alla objekt som refereras i select_criteria.
Inloggningen behöver alla dessa behörigheter:
- ADMINISTRERA MASSÅTGÄRDER
- ÄNDRA ALLA EXTERNA DATAKÄLLOR
- ÄNDRA ALLA EXTERNA FILFORMAT
- I allmänhet måste du ha behörighet att Lista mappinnehåll och Skriva till MAPPEN LOCATION för CETAS.
- I Azure Synapse Analytics and Analytics Platform System Skriv behörighet att läsa och skriva till den externa mappen i Hadoop-klustret eller i Azure Blob Storage.
- I SQL Server 2022 (16.x) måste du också ange rätt behörigheter på den externa platsen. Skriv behörighet att mata ut data till platsen och Läs behörighet att komma åt dem.
- För Azure Blob Storage och Azure Data Lake Gen2 måste
SHARED ACCESS SIGNATURE
-token beviljas följande behörigheter för containern: Läs, Skriva, ListaSkapa. - För Azure Blog Storage måste kryssrutan
Allowed Services
:Blob
vara markerad för att generera SAS-token. - För Azure Data Lake Gen2 måste kryssrutorna
Allowed Services
:Container
ochObject
markeras för att generera SAS-token.
Viktig
Behörigheten ALTER ANY EXTERNAL DATA SOURCE ger alla huvudnamn möjlighet att skapa och ändra alla externa datakällans objekt, så det ger också möjlighet att komma åt alla databasomfattningsautentiseringsuppgifter i databasen. Den här behörigheten måste betraktas som högprivilegierad och får endast beviljas betrodda huvudnamn i systemet.
Felhantering
När CREATE EXTERNAL TABLE AS SELECT
exporterar data till en textavgränsad fil finns det ingen avvisande fil för rader som inte kan exporteras.
När du skapar den externa tabellen försöker databasen ansluta till den externa platsen. Om anslutningen misslyckas misslyckas kommandot och den externa tabellen skapas inte. Det kan ta en minut eller mer innan kommandot misslyckas eftersom databasen försöker ansluta igen minst tre gånger.
Om CREATE EXTERNAL TABLE AS SELECT
avbryts eller misslyckas gör databasen ett engångsförsök att ta bort alla nya filer och mappar som redan har skapats på den externa datakällan.
I Azure Synapse Analytics and Analytics Platform System rapporterar databasen eventuella Java-fel som inträffar på den externa datakällan under dataexporten.
Anmärkningar
När CREATE EXTERNAL TABLE AS SELECT
-instruktionen är klar kan du köra Transact-SQL frågor i den externa tabellen. Dessa åtgärder importerar data till databasen under frågans varaktighet såvida du inte importerar med hjälp av instruktionen CREATE TABLE AS SELECT.
Det externa tabellnamnet och definitionen lagras i databasens metadata. Data lagras i den externa datakällan.
CREATE EXTERNAL TABLE AS SELECT
-instruktionen skapar alltid en icke-partitionerad tabell, även om källtabellen är partitionerad.
För SQL Server 2022 (16.x) måste alternativet allow polybase export
aktiveras med hjälp av sp_configure
. Mer information finns i Ange allow polybase export
konfigurationsalternativ.
För frågeplaner i Azure Synapse Analytics and Analytics Platform System, som skapats med EXPLAIN, använder databasen dessa frågeplansåtgärder för externa tabeller: Flytt av extern shuffle, extern sändningsflytt, extern partitionsflytt.
I Analytics Platform System måste installationsadministratören konfigurera Hadoop-anslutning som en förutsättning för att skapa en extern tabell. Mer information finns i "Konfigurera anslutning till externa data (Analytics Platform System)" i dokumentationen för Analysplattformssystemet, som du kan ladda ned från Microsoft Download Center.
Begränsningar och begränsningar
Eftersom externa tabelldata finns utanför databasen fungerar säkerhetskopierings- och återställningsåtgärder endast på data som lagras i databasen. Därför säkerhetskopieras och återställs endast metadata.
Databasen verifierar inte anslutningen till den externa datakällan när du återställer en databassäkerhetskopia som innehåller en extern tabell. Om den ursprungliga källan inte är tillgänglig kommer metadataåterställningen för den externa tabellen fortfarande att lyckas, men SELECT-åtgärder i den externa tabellen misslyckas.
Databasen garanterar inte datakonsekvens mellan databasen och externa data. Du, kunden, är ensam ansvarig för att upprätthålla konsekvensen mellan externa data och databasen.
DML-åtgärder (Data Manipulation Language) stöds inte i externa tabeller. Du kan till exempel inte använda Transact-SQL uppdatera, infoga eller ta bort Transact-SQL-instruktioner för att ändra externa data.
ÅTGÄRDERNA CREATE TABLE, DROP TABLE, CREATE STATISTICS, DROP STATISTICS, CREATE VIEW och DROP VIEW är de enda DDL-åtgärder (Data Definition Language) som tillåts i externa tabeller.
Begränsningar och begränsningar för Azure Synapse Analytics
I dedikerade SQL-pooler i Azure Synapse Analytics och Analytics Platform System kan PolyBase använda högst 33 000 filer per mapp när 32 samtidiga PolyBase-frågor körs. Det här maximala antalet inkluderar både filer och undermappar i varje HDFS-mapp. Om samtidigheten är mindre än 32 kan en användare köra PolyBase-frågor mot mappar i HDFS som innehåller mer än 33 000 filer. Vi rekommenderar att användare av Hadoop och PolyBase håller filsökvägarna korta och använder högst 30 000 filer per HDFS-mapp. När för många filer refereras inträffar ett undantag från JVM out-of-memory.
I serverlösa SQL-pooler kan externa tabeller inte skapas på en plats där du för närvarande har data. Om du vill återanvända en plats som har använts för att lagra data måste platsen tas bort manuellt på ADLS. Fler begränsningar och metodtips finns i Metodtips för filteroptimering.
I dedikerade SQL-pooler i Azure Synapse Analytics och Analytics Platform System får kolumnvärdena i RCFile inte innehålla tecknet pipe (|
) när CREATE EXTERNAL TABLE AS SELECT
väljer från en RCFile.
SET ROWCOUNT (Transact-SQL) har ingen effekt på SKAPA EXTERN TABELL SOM SELECT. Använd TOP (Transact-SQL)för att uppnå ett liknande beteende.
Granska Namngivning och referens av containrar, blobar och metadata för begränsningar i filnamn.
Teckenfel
Följande tecken som finns i data kan orsaka fel, inklusive avvisade poster med CREATE EXTERNAL TABLE AS SELECT
till Parquet-filer.
I Azure Synapse Analytics and Analytics Platform System gäller detta även för ORC-filer.
|
-
"
(citattecken) \r\n
\r
\n
Om du vill använda CREATE EXTERNAL TABLE AS SELECT
som innehåller dessa tecken måste du först köra CREATE EXTERNAL TABLE AS SELECT
-instruktionen för att exportera data till avgränsade textfiler där du sedan kan konvertera dem till Parquet eller ORC med hjälp av ett externt verktyg.
Arbeta med parquet
När du arbetar med parquet-filer genererar CREATE EXTERNAL TABLE AS SELECT
en parquetfil per tillgänglig PROCESSOR, upp till den konfigurerade maximala graden av parallellitet (MAXDOP). Varje fil kan växa upp till 190 GB, efter det genererar SQL Server fler Parquet-filer efter behov.
Frågetipset OPTION (MAXDOP n)
påverkar bara SELECT-delen av CREATE EXTERNAL TABLE AS SELECT
. Det har ingen inverkan på antalet parquet-filer. Endast MAXDOP på databasnivå och MAXDOP på instansnivå beaktas.
Låsning
Tar ett delat lås på OBJEKTET SCHEMARESOLUTION.
Datatyper som stöds
CETAS kan användas för att lagra resultatuppsättningar med följande SQL-datatyper:
- binär
- varbinary
- röding
- varchar
- nchar
- nvarchar
- smalldate
- datum
- datetime
- datetime2
- datetimeoffset
- Tid
- decimal
- numerisk
- flyta
- verklig
- bigint
- tinyint
- smallint
- Int
- bigint
- bit
- pengar
- smallmoney
Exempel
A. Skapa en Hadoop-tabell med HJÄLP av CREATE EXTERNAL TABLE AS SELECT
gäller för: Azure Synapse Analytics and Analytics Platform System
I följande exempel skapas en ny extern tabell med namnet hdfsCustomer
som använder kolumndefinitionerna och data från källtabellen dimCustomer
.
Tabelldefinitionen lagras i databasen och resultatet av SELECT-instruktionen exporteras till den /pdwdata/customer.tbl
filen på den externa Hadoop-datakällan customer_ds. Filen är formaterad enligt det externa filformatet customer_ff.
Filnamnet genereras av databasen och innehåller fråge-ID:t för att enkelt justera filen med frågan som genererade den.
Sökvägen hdfs://xxx.xxx.xxx.xxx:5000/files/
före kundkatalogen måste redan finnas. Om kundkatalogen inte finns skapar databasen katalogen.
Not
Det här exemplet anger för 5 000. Om porten inte anges använder databasen 8020 som standardport.
Den resulterande Hadoop-platsen och filnamnet blir hdfs:// xxx.xxx.xxx.xxx:5000/files/Customer/ QueryID_YearMonthDay_HourMinutesSeconds_FileIndex.txt.
.
-- Example is based on AdventureWorks
CREATE EXTERNAL TABLE hdfsCustomer
WITH (
LOCATION = '/pdwdata/customer.tbl',
DATA_SOURCE = customer_ds,
FILE_FORMAT = customer_ff
) AS
SELECT *
FROM dimCustomer;
GO
B. Använd ett frågetips med CREATE EXTERNAL TABLE AS SELECT
gäller för: Azure Synapse Analytics and Analytics Platform System
Den här frågan visar den grundläggande syntaxen för att använda ett frågekopplingstips med instruktionen CREATE EXTERNAL TABLE AS SELECT
. När frågan har skickats använder databasen hashkopplingsstrategin för att generera frågeplanen. Mer information om kopplingstips och hur du använder OPTION-satsen finns i OPTION-satsen (Transact-SQL).
Not
Det här exemplet anger för 5 000. Om porten inte anges använder databasen 8020 som standardport.
-- Example is based on AdventureWorks
CREATE EXTERNAL TABLE dbo.FactInternetSalesNew
WITH (
LOCATION = '/files/Customer',
DATA_SOURCE = customer_ds,
FILE_FORMAT = customer_ff
) AS
SELECT T1.*
FROM dbo.FactInternetSales T1
INNER JOIN dbo.DimCustomer T2
ON (T1.CustomerKey = T2.CustomerKey)
OPTION (HASH JOIN);
GO
C. Använda CETAS för att ändra kolumnattribut
gäller för: Azure Synapse Analytics and Analytics Platform System
I det här exemplet används CETAS för att ändra datatyper, nullabilitet och sortering för flera kolumner i FactInternetSales
-tabellen.
-- Example is based on AdventureWorks
CREATE EXTERNAL TABLE dbo.FactInternetSalesNew
WITH (
LOCATION = '/files/Customer',
DATA_SOURCE = customer_ds,
FILE_FORMAT = customer_ff
) AS
SELECT T1.ProductKey AS ProductKeyNoChange,
T1.OrderDateKey AS OrderDate,
T1.ShipDateKey AS ShipDate,
T1.CustomerKey AS CustomerKeyNoChange,
T1.OrderQuantity AS Quantity,
T1.SalesAmount AS MONEY
FROM dbo.FactInternetSales T1
INNER JOIN dbo.DimCustomer T2
ON (T1.CustomerKey = T2.CustomerKey)
OPTION (HASH JOIN);
GO
D. Använd CREATE EXTERNAL TABLE AS SELECT för att exportera data som parquet
gäller för: SQL Server 2022 (16.x)
I följande exempel skapas en ny extern tabell med namnet ext_sales
som använder data från tabellen SalesOrderDetail
i AdventureWorks2022
. Alternativet tillåta konfiguration av polybase-export måste vara aktiverat.
Resultatet av SELECT-instruktionen sparas på S3-kompatibel objektlagring som tidigare konfigurerats och heter s3_eds
och rätt autentiseringsuppgifter som skapats som s3_dsc
. Parquet-filplatsen kommer att vara <ip>:<port>/cetas/sales.parquet
där cetas
är den tidigare skapade lagringshinken.
Not
Delta-format stöds för närvarande endast som skrivskyddat.
-- Credential to access the S3-compatible object storage
CREATE DATABASE SCOPED CREDENTIAL s3_dsc
WITH IDENTITY = 'S3 Access Key',
SECRET = '<accesskeyid>:<secretkeyid>'
GO
-- S3-compatible object storage data source
CREATE EXTERNAL DATA SOURCE s3_eds
WITH (
LOCATION = 's3://<ip>:<port>',
CREDENTIAL = s3_dsc
)
-- External File Format for PARQUET
CREATE EXTERNAL FILE FORMAT ParquetFileFormat
WITH (FORMAT_TYPE = PARQUET);
GO
CREATE EXTERNAL TABLE ext_sales
WITH (
LOCATION = '/cetas/sales.parquet',
DATA_SOURCE = s3_eds,
FILE_FORMAT = ParquetFileFormat
) AS
SELECT *
FROM AdventureWorks2022.[Sales].[SalesOrderDetail];
GO
E. Använd CREATE EXTERNAL TABLE AS SELECT från deltatabell till parquet
gäller för: SQL Server 2022 (16.x)
I följande exempel skapas en ny extern tabell med namnet Delta_to_Parquet
, som använder Delta Table-typen av data som finns i en S3-kompatibel objektlagring med namnet s3_delta
och skriver resultatet i en annan datakälla med namnet s3_parquet
som en parquet-fil. För det använder exemplet kommandot OPENROWSET. Alternativet tillåta konfiguration av polybase-export måste vara aktiverat.
-- External File Format for PARQUET
CREATE EXTERNAL FILE FORMAT ParquetFileFormat
WITH (FORMAT_TYPE = PARQUET);
GO
CREATE EXTERNAL TABLE Delta_to_Parquet
WITH (
LOCATION = '/backup/sales.parquet',
DATA_SOURCE = s3_parquet,
FILE_FORMAT = ParquetFileFormat
) AS
SELECT *
FROM OPENROWSET(BULK '/delta/sales_fy22/', FORMAT = 'DELTA', DATA_SOURCE = 's3_delta') AS [r];
GO
F. Använda CREATE EXTERNAL TABLE AS SELECT med en vy som källa
gäller för: Serverlösa SQL-pooler och dedikerade SQL-pooler i Azure Synapse Analytics.
Använd följande exempel som en mall för att skriva CETAS med en användardefinierad vy som källa, med hjälp av en hanterad identitet för autentisering och abfs:
-slutpunkten:
CREATE DATABASE [<mydatabase>];
GO
USE [<mydatabase>];
GO
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<strong password>';
CREATE DATABASE SCOPED CREDENTIAL [WorkspaceIdentity] WITH IDENTITY = 'managed identity';
GO
CREATE EXTERNAL FILE FORMAT [ParquetFF] WITH (
FORMAT_TYPE = PARQUET,
DATA_COMPRESSION = 'org.apache.hadoop.io.compress.SnappyCodec'
);
GO
CREATE EXTERNAL DATA SOURCE [SynapseSQLwriteable] WITH (
LOCATION = 'abfs[s]://<file_system>@<account_name>.dfs.core.windows.net/<path>/<file_name>',
CREDENTIAL = [WorkspaceIdentity]
);
GO
CREATE EXTERNAL TABLE [dbo].[<myexternaltable>] WITH (
LOCATION = '<myoutputsubfolder>/',
DATA_SOURCE = [SynapseSQLwriteable],
FILE_FORMAT = [ParquetFF]
) AS
SELECT * FROM [<myview>];
GO
G. Använda CREATE EXTERNAL TABLE AS SELECT med en vy som källa
gäller för: Serverlösa SQL-pooler och dedikerade SQL-pooler i Azure Synapse Analytics.
I det här exemplet kan vi se exempel på en mallkod för att skriva CETAS med en användardefinierad vy som källa, använda hanterad identitet som autentisering och https:
.
CREATE DATABASE [<mydatabase>];
GO
USE [<mydatabase>];
GO
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<strong password>';
CREATE DATABASE SCOPED CREDENTIAL [WorkspaceIdentity] WITH IDENTITY = 'managed identity';
GO
CREATE EXTERNAL FILE FORMAT [ParquetFF] WITH (
FORMAT_TYPE = PARQUET,
DATA_COMPRESSION = 'org.apache.hadoop.io.compress.SnappyCodec'
);
GO
CREATE EXTERNAL DATA SOURCE [SynapseSQLwriteable] WITH (
LOCATION = 'https://<mystoageaccount>.dfs.core.windows.net/<mycontainer>/<mybaseoutputfolderpath>',
CREDENTIAL = [WorkspaceIdentity]
);
GO
CREATE EXTERNAL TABLE [dbo].[<myexternaltable>] WITH (
LOCATION = '<myoutputsubfolder>/',
DATA_SOURCE = [SynapseSQLwriteable],
FILE_FORMAT = [ParquetFF]
) AS
SELECT * FROM [<myview>];
GO
Nästa steg
gäller för:Azure SQL Managed Instance
Skapar en extern tabell och exporterar sedan, parallellt, resultatet av en Transact-SQL SELECT-instruktion.
Du kan använda CREATE EXTERNAL TABLE AS SELECT
(CETAS) för att utföra följande uppgifter:
- Skapa en extern tabell ovanpå Parquet- eller CSV-filer i Azure Blob Storage eller Azure Data Lake Storage (ADLS) Gen2.
- Exportera parallellt resultatet av en T-SQL SELECT-instruktion till den skapade externa tabellen.
- Fler datavirtualiseringsfunktioner i Azure SQL Managed Instance finns i Datavirtualisering med Azure SQL Managed Instance.
Not
Det här innehållet gäller endast för Azure SQL Managed Instance. För andra plattformar väljer du lämplig version av CREATE EXTERNAL TABLE AS SELECT från listrutans väljare.
Transact-SQL syntaxkonventioner
Syntax
CREATE EXTERNAL TABLE [ [database_name . [ schema_name ] . ] | schema_name . ] table_name
WITH (
LOCATION = 'path_to_folder/',
DATA_SOURCE = external_data_source_name,
FILE_FORMAT = external_file_format_name
[, PARTITION ( column_name [ , ...n ] ) ]
)
AS <select_statement>
[;]
<select_statement> ::=
[ WITH <common_table_expression> [ ,...n ] ]
SELECT <select_criteria>
Argument
[ [ database_name . [ schema_name ] . ] | schema_name . ] table_name
Tabellens namn i en till tre delar som ska skapas. För en extern tabell lagras endast tabellmetadata. Inga faktiska data flyttas eller lagras.
LOCATION = "path_to_folder"
Anger var resultatet av SELECT-instruktionen ska skrivas på den externa datakällan. Rotmappen är den dataplats som anges i den externa datakällan. LOCATION måste peka på en mapp och ha en avslutande /
. Exempel: aggregated_data/
.
Målmappen för CETAS måste vara tom. Om sökvägen och mappen inte redan finns skapas de automatiskt.
DATA_SOURCE = external_data_source_name
Anger namnet på det externa datakällans objekt som innehåller platsen där externa data ska lagras. Om du vill skapa en extern datakälla använder du CREATE EXTERNAL DATA SOURCE (Transact-SQL).
FILE_FORMAT = external_file_format_name
Anger namnet på det externa filformatobjektet som innehåller formatet för den externa datafilen. Om du vill skapa ett externt filformat använder du CREATE EXTERNAL FILE FORMAT (Transact-SQL). För närvarande stöds endast externa filformat med FORMAT_TYPE=PARQUET och FORMAT_TYPE=DELIMITEDTEXT. GZip-komprimering för DELIMITEDTEXT-format stöds inte.
[, PARTITION ( kolumnnamn [ , ... n ] ) ]
Partitioner utdata i flera parquet-filsökvägar. Partitionering sker per angiven kolumn (column_name
), som matchar jokertecken (*) i kolumnen LOCATION till respektive partitionering. Antalet kolumner i PARTITION-delen måste matcha antalet jokertecken i LOCATION. Det måste finnas minst en kolumn som inte används för partitionering.
MED <common_table_expression>
Anger en tillfällig namngiven resultatuppsättning, som kallas för ett gemensamt tabelluttryck (CTE). Mer information finns i WITH common_table_expression (Transact-SQL).
VÄLJ <select_criteria>
Fyller i den nya tabellen med resultatet från en SELECT-instruktion. select_criteria är brödtexten i SELECT-instruktionen som avgör vilka data som ska kopieras till den nya tabellen. Information om SELECT-instruktioner finns i SELECT (Transact-SQL).
Not
ORDER BY-satsen i SELECT stöds inte för CETAS.
Behörigheter
Behörigheter i lagring
Du måste ha behörighet att visa mappinnehåll och skriva till LOCATION-sökvägen för att CETAS ska fungera.
Autentiseringsmetoder som stöds är hanterad identitet eller en SAS-token (Signatur för delad åtkomst).
- Om du använder hanterad identitet för autentisering kontrollerar du att tjänstens huvudnamn för din SQL-hanterade instans har rollen Storage Blob Data Contributor på målcontainern.
- Om du använder en SAS-token krävs Läs, Writeoch List behörigheter.
- För Azure Blog Storage måste kryssrutan
Allowed Services
:Blob
vara markerad för att generera SAS-token. - För Azure Data Lake Gen2 måste kryssrutorna
Allowed Services
:Container
ochObject
markeras för att generera SAS-token.
En användartilldelad hanterad identitet stöds inte. Microsoft Entra-genomströmningsautentisering stöds inte. Microsoft Entra ID är (tidigare Azure Active Directory).
Behörigheter i sql-hanterad instans
För att köra det här kommandot behöver -databasanvändaren alla dessa behörigheter eller medlemskap:
- ALTER SCHEMA behörighet för det lokala schemat som innehåller den nya tabellen eller medlemskapet i den db_ddladmin fasta databasrollen.
- SKAPA TABELL behörighet eller medlemskap i den db_ddladmin fasta databasrollen.
- SELECT behörighet för alla objekt som refereras i select_criteria.
Inloggningen behöver alla dessa behörigheter:
- ADMINISTRERA MASSÅTGÄRDER
- ÄNDRA ALLA EXTERNA DATAKÄLLOR
- ÄNDRA ALLA EXTERNA FILFORMAT
Viktig
Behörigheten ALTER ANY EXTERNAL DATA SOURCE ger alla huvudnamn möjlighet att skapa och ändra alla externa datakällans objekt, så det ger också möjlighet att komma åt alla databasomfattningsautentiseringsuppgifter i databasen. Den här behörigheten måste betraktas som högprivilegierad och får endast beviljas betrodda huvudnamn i systemet.
Datatyper som stöds
CETAS lagrar resultatuppsättningar med följande SQL-datatyper:
- binär
- varbinary
- röding
- varchar
- nchar
- nvarchar
- smalldatetime
- datum
- datetime
- datetime2
- datetimeoffset
- Tid
- decimal
- numerisk
- flyta
- verklig
- bigint
- tinyint
- smallint
- Int
- bigint
- bit
- pengar
- smallmoney
Not
LoBs större än 1MB kan inte användas med CETAS.
Begränsningar och begränsningar
-
CREATE EXTERNAL TABLE AS SELECT
(CETAS) för Azure SQL Managed Instance är inaktiverad som standard. Mer information finns i nästa avsnitt Inaktiverad som standard. - Mer information om begränsningar eller kända problem med datavirtualisering i Azure SQL Managed Instance finns i begränsningar och kända problem.
Eftersom externa tabelldata finns utanför databasen fungerar säkerhetskopierings- och återställningsåtgärder endast på data som lagras i databasen. Därför säkerhetskopieras och återställs endast metadata.
Databasen verifierar inte anslutningen till den externa datakällan när du återställer en databassäkerhetskopia som innehåller en extern tabell. Om den ursprungliga källan inte är tillgänglig lyckas fortfarande metadataåterställningen för den externa tabellen, men SELECT-åtgärder i den externa tabellen misslyckas.
Databasen garanterar inte datakonsekvens mellan databasen och externa data. Du, kunden, är ensam ansvarig för att upprätthålla konsekvensen mellan externa data och databasen.
DML-åtgärder (Data Manipulation Language) stöds inte i externa tabeller. Du kan till exempel inte använda Transact-SQL uppdatera, infoga eller ta bort Transact-SQLstatements för att ändra externa data.
ÅTGÄRDERNA CREATE TABLE, DROP TABLE, CREATE STATISTICS, DROP STATISTICS, CREATE VIEW och DROP VIEW är de enda DDL-åtgärder (Data Definition Language) som tillåts i externa tabeller.
Det går inte att skapa externa tabeller på en plats där du för närvarande har data. Om du vill återanvända en plats som har använts för att lagra data måste platsen tas bort manuellt på ADLS.
SET ROWCOUNT (Transact-SQL) har ingen effekt på SKAPA EXTERN TABELL SOM SELECT. Använd TOP (Transact-SQL)för att uppnå ett liknande beteende.
Granska Namngivning och referens av containrar, blobar och metadata för begränsningar i filnamn.
Lagringstyper
Filer kan lagras i Azure Data Lake Storage Gen2 eller Azure Blob Storage. Om du vill fråga efter filer måste du ange platsen i ett visst format och använda platstypprefixet som motsvarar typen av extern källa och slutpunkt/protokoll, till exempel följande exempel:
--Blob Storage endpoint
abs://<container>@<storage_account>.blob.core.windows.net/<path>/<file_name>.parquet
--Data Lake endpoint
adls://<container>@<storage_account>.blob.core.windows.net/<path>/<file_name>.parquet
Viktig
Det angivna platstypsprefixet används för att välja det optimala protokollet för kommunikation och för att utnyttja alla avancerade funktioner som erbjuds av den specifika lagringstypen.
Användning av det allmänna https://
prefixet är inaktiverat. Använd alltid slutpunktsspecifika prefix.
Inaktiverad som standard
MED SKAPA EXTERN TABELL SOM SELECT (CETAS) kan du exportera data från din SQL-hanterade instans till ett externt lagringskonto, så det finns risk för dataexfiltrering med dessa funktioner. Därför är CETAS inaktiverat som standard för Azure SQL Managed Instance.
Aktivera CETAS
CETAS för Azure SQL Managed Instance kan bara aktiveras via en metod som kräver utökade Azure-behörigheter och som inte kan aktiveras via T-SQL. På grund av risken för obehörig dataexfiltrering kan CETAS inte aktiveras via den sp_configure
lagrade T-SQL-proceduren, utan kräver i stället användaråtgärden utanför den SQL-hanterade instansen.
Behörigheter för att aktivera CETAS
Om du vill aktivera via Azure PowerShell måste användaren som kör kommandot ha Deltagare eller SQL Security Manager Azure RBAC-roller för din SQL-hanterade instans.
En anpassad roll kan också skapas för detta, vilket kräver åtgärden Läs och Write för åtgärden Microsoft.Sql/managedInstances/serverConfigurationOptions
.
Metoder för att aktivera CETAS
För att kunna anropa PowerShell-kommandona på en dator måste Az-paketversion 9.7.0 eller senare installeras lokalt. Du kan också använda Azure Cloud Shell- för att köra Azure PowerShell på shell.azure.com.
Logga först in på Azure och ange rätt kontext för din prenumeration:
Login-AzAccount
$SubscriptionID = "<YourSubscriptionIDHERE>"
Select-AzSubscription -SubscriptionName $SubscriptionID
Om du vill hantera serverkonfigurationsalternativet allowPolybaseExport
justerar du följande PowerShell-skript till din prenumeration och sql-hanterade instansnamn och kör sedan kommandona. Mer information finns i Set-AzSqlServerConfigurationOption och Get-AzSqlServerConfigurationOption.
# Enable ServerConfigurationOption with name "allowPolybaseExport"
Set-AzSqlServerConfigurationOption -ResourceGroupName "resource_group_name" -InstanceName "ManagedInstanceName" `
-Name "allowPolybaseExport" -Value 1
Så här inaktiverar du serverkonfigurationsalternativet "allowPolybaseExport":
# Disable ServerConfigurationOption with name "allowPolybaseExport"
Set-AzSqlServerConfigurationOption -ResourceGroupName "resource_group_name" -InstanceName "ManagedInstanceName" `
-Name "allowPolybaseExport" -Value 0
Så här hämtar du det aktuella värdet för serverkonfigurationsalternativet "allowPolybaseExport":
# Get ServerConfigurationOptions with name "allowPolybaseExport"
Get-AzSqlServerConfigurationOption -ResourceGroupName "resource_group_name" -InstanceName "ManagedInstanceName" `
-Name "allowPolybaseExport"
Verifiera status för CETAS
När som helst kan du kontrollera den aktuella statusen för CETAS-konfigurationsalternativet.
Anslut till din SQL-hanterade instans. Kör följande T-SQL och observera kolumnen value
i svaret. När serverkonfigurationsändringen är klar bör resultatet av den här frågan matcha önskad inställning.
SELECT [name], [value] FROM sys.configurations WHERE name ='allow polybase export';
Felsöka
Fler steg för att felsöka datavirtualisering i Azure SQL Managed Instance finns i Felsöka. Felhantering och vanliga felmeddelanden för CETAS i Azure SQL Managed Instance följer.
Felhantering
När CREATE EXTERNAL TABLE AS SELECT
exporterar data till en textavgränsad fil finns det ingen avvisande fil för rader som inte kan exporteras.
När du skapar den externa tabellen försöker databasen ansluta till den externa platsen. Om anslutningen misslyckas misslyckas kommandot och den externa tabellen skapas inte. Det kan ta en minut eller mer innan kommandot misslyckas eftersom databasen försöker ansluta igen minst tre gånger.
Vanliga felmeddelanden
De här vanliga felmeddelandena innehåller snabbförklaringar för CETAS för Azure SQL Managed Instance.
Ange en plats som redan finns i lagringen.
Lösning: Rensa lagringsplats (inklusive ögonblicksbild) eller ändra platsparametern i frågan.
Exempel på felmeddelande:
Msg 15842: Cannot create external table. External table location already exists.
Kolumnvärden som formateras med JSON-objekt.
Lösning: Konvertera värdekolumn till en enskild VARCHAR- eller NVARCHAR-kolumn, eller en uppsättning kolumner med explicit definierade typer.
Exempel på felmeddelande:
Msg 16549: Values in column value are formatted as JSON objects and cannot be written using CREATE EXTERNAL TABLE AS SELECT.
Platsparametern är ogiltig (till exempel flera
//
).Lösning: Åtgärda platsparameter.
Exempel på felmeddelande:
Msg 46504: External option 'LOCATION' is not valid. Ensure that the length and range are appropriate.
Ett av de alternativ som krävs saknas (DATA_SOURCE, FILE_FORMAT, LOCATION).
Lösning: Lägg till parametern som saknas i CETAS-frågan.
Exempel på felmeddelande:
Msg 46505: Missing required external DDL option 'FILE_FORMAT'
Åtkomstproblem (ogiltiga autentiseringsuppgifter, utgångna autentiseringsuppgifter eller autentiseringsuppgifter med otillräcklig behörighet). En alternativ möjlighet är en ogiltig sökväg, där den HANTERADE SQL-instansen tog emot fel 404 från lagringen.
Lösning: Verifiera giltighet och behörigheter för autentiseringsuppgifter. Alternativt kan du verifiera att sökvägen är giltig och att lagring finns. Använd URL-sökvägen
adls://<container>@<storage_account>.blob.core.windows.net/<path>/
.Exempel på felmeddelande:
Msg 15883: Access check for '<Read/Write>' operation against '<Storage>' failed with HRESULT = '0x...'
Platsdelen av DATA_SOURCE innehåller jokertecken.
Lösning: Ta bort jokertecken från platsen.
Exempel på felmeddelande:
Msg 16576: Location provided by DATA_SOURCE '<data source name>' cannot contain any wildcards.
Antalet jokertecken i LOCATION-parametern och antalet partitionerade kolumner matchar inte.
Lösning: Se till att det finns samma antal jokertecken i LOCATION som partitionskolumner.
Exempel på felmeddelande:
Msg 16577: Number of wildcards in LOCATION must match the number of columns in PARTITION clause.
Kolumnnamnet i PARTITION-satsen matchar inte några kolumner i listan.
Lösning: Kontrollera att kolumnerna i PARTITION är giltiga.
Exempel på felmeddelande:
Msg 16578: The column name '<column name>' specified in the PARTITION option does not match any column specified in the column list
Kolumnen har angetts mer än en gång i PARTITION-listan.
Lösning: Kontrollera att kolumnerna i PARTITION-satsen är unika.
Exempel på felmeddelande:
Msg 16579: A column has been specified more than once in the PARTITION list. Column '<column name>' is specified more than once.
Kolumnen har angetts mer än en gång i partitionslistan, eller så matchar den inga kolumner från SELECT-listan.
Lösning: Se till att inga dubbletter finns i partitionslistan och att partitionskolumnerna finns i SELECT-delen.
Exempel på felmeddelanden:
Msg 11569: Column <column name> has been specified more than once in the partition columns list. Please try again with a valid parameter.
ellerMsg 11570: Column <column name> specified in the partition columns list does not match any columns in SELECT clause. Please try again with a valid parameter.
Använd alla kolumner i PARTITION-listan.
Lösning: Minst en av kolumnerna från SELECT-delen får inte finnas i PARTITION-delen av frågan.
Exempel på felmeddelande:
Msg 11571: All output columns in DATA_EXPORT query are declared as PARTITION columns. DATA_EXPORT query requires at least one column to export.
Funktionen är inaktiverad.
Lösning: Aktivera funktionen med hjälp av avsnittet Inaktiverad som standard i den här artikeln.
Exempel på felmeddelande:
Msg 46552: Writing into an external table is disabled. See 'https://go.microsoft.com/fwlink/?linkid=2201073' for more information
Låsning
Tar ett delat lås på OBJEKTET SCHEMARESOLUTION.
Exempel
A. Använda CETAS med en vy för att skapa en extern tabell med hjälp av den hanterade identiteten
Det här exemplet innehåller kod för att skriva CETAS med en vy som källa, med hjälp av systemhanterad identitet en autentisering.
CREATE DATABASE [<mydatabase>];
GO
USE [<mydatabase>];
GO
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<strong password>';
CREATE DATABASE SCOPED CREDENTIAL [WorkspaceIdentity] WITH IDENTITY = 'managed identity';
GO
CREATE EXTERNAL FILE FORMAT [ParquetFF] WITH (
FORMAT_TYPE = PARQUET,
DATA_COMPRESSION = 'org.apache.hadoop.io.compress.SnappyCodec'
);
GO
CREATE EXTERNAL DATA SOURCE [SQLwriteable] WITH (
LOCATION = 'adls://container@mystorageaccount.blob.core.windows.net/mybaseoutputfolderpath',
CREDENTIAL = [WorkspaceIdentity]
);
GO
CREATE EXTERNAL TABLE [dbo].[<myexternaltable>] WITH (
LOCATION = '<myoutputsubfolder>/',
DATA_SOURCE = [SQLwriteable],
FILE_FORMAT = [ParquetFF]
) AS
SELECT * FROM [<myview>];
GO
B. Använda CETAS med en vy för att skapa en extern tabell med SAS-autentisering
Det här exemplet innehåller kod för att skriva CETAS med en vy som källa, med en SAS-token som autentisering.
CREATE DATABASE [<mydatabase>];
GO
USE [<mydatabase>];
GO
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<strong password>';
CREATE DATABASE SCOPED CREDENTIAL SAS_token
WITH
IDENTITY = 'SHARED ACCESS SIGNATURE',
-- Remove ? from the beginning of the SAS token
SECRET = '<azure_shared_access_signature>' ;
GO
CREATE EXTERNAL FILE FORMAT [ParquetFF] WITH (
FORMAT_TYPE = PARQUET,
DATA_COMPRESSION = 'org.apache.hadoop.io.compress.SnappyCodec'
);
GO
CREATE EXTERNAL DATA SOURCE [SQLwriteable] WITH (
LOCATION = 'adls://container@mystorageaccount.blob.core.windows.net/mybaseoutputfolderpath',
CREDENTIAL = [SAS_token]
);
GO
CREATE EXTERNAL TABLE [dbo].[<myexternaltable>] WITH (
LOCATION = '<myoutputsubfolder>/',
DATA_SOURCE = [SQLwriteable],
FILE_FORMAT = [ParquetFF]
) AS
SELECT * FROM [<myview>];
GO
C. Skapa en extern tabell i en enda parquet-fil på lagringen
Följande två exempel visar hur du avlastar en del av data från en lokal tabell till en extern tabell som lagras som parquet-filer i Azure Blob Storage-containern. De är utformade för att fungera med AdventureWorks2022
databas. Det här exemplet visar hur du skapar en extern tabell som en enskild parquet-fil, där nästa exempel visar hur du skapar en extern tabell och partitionera den i flera mappar med parquet-filer.
Exemplet nedan fungerar med hanterad identitet för autentisering. Kontrollera därför att tjänstens huvudnamn för Azure SQL Managed Instance har Storage Blob Data Contributor roll i Azure Blob Storage-containern. Du kan också ändra exemplet och använda SAS-token (Shared Access Secret) för autentisering.
I följande exempel skapar du en extern tabell i en enda parquet-fil i Azure Blob Storage och väljer från SalesOrderHeader
tabell för beställningar som är äldre än 1 jan-2014:
--Example 1: Creating an external table into a single parquet file on the storage, selecting from SalesOrderHeader table for orders older than 1-Jan-2014:
USE [AdventureWorks2022]
GO
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'Strong Password';
GO
CREATE DATABASE SCOPED CREDENTIAL [CETASCredential]
WITH IDENTITY = 'managed identity';
GO
CREATE EXTERNAL DATA SOURCE [CETASExternalDataSource]
WITH (
LOCATION = 'abs://container@storageaccount.blob.core.windows.net',
CREDENTIAL = [CETASCredential] );
GO
CREATE EXTERNAL FILE FORMAT [CETASFileFormat]
WITH(
FORMAT_TYPE=PARQUET,
DATA_COMPRESSION = 'org.apache.hadoop.io.compress.SnappyCodec'
);
GO
-- Count how many rows we plan to offload
SELECT COUNT(*) FROM [AdventureWorks2022].[Sales].[SalesOrderHeader] WHERE
OrderDate < '2013-12-31';
-- CETAS write to a single file, archive all data older than 1-Jan-2014:
CREATE EXTERNAL TABLE SalesOrdersExternal
WITH (
LOCATION = 'SalesOrders/',
DATA_SOURCE = [CETASExternalDataSource],
FILE_FORMAT = [CETASFileFormat])
AS
SELECT
*
FROM
[AdventureWorks2022].[Sales].[SalesOrderHeader]
WHERE
OrderDate < '2013-12-31';
-- you can query the newly created external table
SELECT COUNT (*) FROM SalesOrdersExternal;
D. Skapa en partitionerad extern tabell i flera parquet-filer som lagras i ett mappträd
Det här exemplet bygger på föregående exempel för att visa hur du skapar en extern tabell och partitionera den i flera mappar med parquet-filer. Du kan använda partitionerade tabeller för att få prestandafördelar om datamängden är stor.
Skapa en extern tabell från SalesOrderHeader
data med hjälp av stegen från exempel B, men partitionering av den externa tabellen efter OrderDate
år och månad. När vi kör frågor mot partitionerade externa tabeller kan vi dra nytta av partitionseliminering för prestanda.
--CETAS write to a folder hierarchy (partitioned table):
CREATE EXTERNAL TABLE SalesOrdersExternalPartitioned
WITH (
LOCATION = 'PartitionedOrders/year=*/month=*/',
DATA_SOURCE = CETASExternalDataSource,
FILE_FORMAT = CETASFileFormat,
--year and month will correspond to the two respective wildcards in folder path
PARTITION (
[Year],
[Month]
)
)
AS
SELECT
*,
YEAR(OrderDate) AS [Year],
MONTH(OrderDate) AS [Month]
FROM [AdventureWorks2022].[Sales].[SalesOrderHeader]
WHERE
OrderDate < '2013-12-31';
GO
-- you can query the newly created partitioned external table
SELECT COUNT (*) FROM SalesOrdersExternalPartitioned;