Erstellen und Ändern externer Azure Storage-Tabellen
Die Befehle in diesem Artikel können verwendet werden, um eine externe Azure Storage-Tabelle in der Datenbank zu erstellen oder zu ändern, aus der der Befehl ausgeführt wird. Eine externe Azure Storage-Tabelle verweist auf Daten in Azure Blob Storage, Azure Data Lake Store Gen1 oder Azure Data Lake Store Gen2.
Hinweis
Wenn die Tabelle vorhanden ist, schlägt der .create
Befehl mit einem Fehler fehl. Verwenden oder .create-or-alter
.alter
ändern Sie vorhandene Tabellen.
Berechtigungen
Erfordert .create
mindestens Datenbankbenutzerberechtigungen und .alter
mindestens Tabellen-Admin-Berechtigungen.
Für .create-or-alter
eine externe Tabelle mit der Authentifizierung mit verwalteter Identität sind AllDatabasesAdmin-Berechtigungen erforderlich.
Syntax
(.create
.alter
| | .create-or-alter
) external
table
TableName(
Schema)
kind
storage
=
[partition
by
(
Partitions)
[pathformat
=
(
PathFormat)
]] dataformat
=
DataFormat(
StorageConnectionString [,
...] )
[with
(
Eigenschaft [,
...])
]
Hinweis
kind
gilt storage
für alle externen Azure Storage-Datenspeichertypen. blob
und adl
sind veraltete Begriffe.
Erfahren Sie mehr über Syntaxkonventionen.
Parameter
Name | Typ | Erforderlich | BESCHREIBUNG |
---|---|---|---|
TableName | string |
✔️ | Ein externer Tabellenname, der den Entitätsnamensregeln entspricht. Eine externe Tabelle kann nicht den gleichen Namen wie eine reguläre Tabelle in derselben Datenbank haben. |
Schema | string |
✔️ | Das externe Datenschema ist eine durch Trennzeichen getrennte Liste mit einem oder mehreren Spaltennamen und Datentypen, wobei jedes Element dem Format ColumnName: ColumnType folgt. Wenn das Schema unbekannt ist, verwenden Sie infer_storage_schema , um das Schema basierend auf externen Dateiinhalten abzuleiten. |
Partitionen | string |
Eine durch Trennzeichen getrennte Liste von Spalten, durch die die externe Tabelle partitioniert ist. Partitionsspalte kann in der Datendatei selbst oder als Teil des Dateipfads vorhanden sein. Unter Partitionsformatierung erfahren Sie, wie dieser Wert aussehen sollte. | |
PathFormat | string |
Ein externes Datenordner-URI-Pfadformat, das mit Partitionen verwendet werden soll. Siehe Pfadformat. | |
DataFormat | string |
✔️ | Das Datenformat, bei dem es sich um ein beliebiges Erfassungsformat sein kann. Es wird empfohlen, das Format für externe Tabellen zu verwenden, um die Parquet Abfrage- und Exportleistung zu verbessern, es sei denn, Sie verwenden JSON die Pfadzuordnung. Wenn Sie eine externe Tabelle für das Exportszenario verwenden, sind Sie auf die folgenden Formate beschränkt: CSV , TSV und Parquet JSON . |
StorageConnectionString | string |
✔️ | Mindestens ein durch Trennzeichen getrennte Pfade zu Azure Blob Storage Blobcontainern, Azure Data Lake Gen2-Dateisystemen oder Azure Data Lake Gen 1-Containern, einschließlich Anmeldeinformationen. Der externe Tabellenspeichertyp wird durch die bereitgestellten Verbindungszeichenfolgen bestimmt. Weitere Informationen finden Sie unter Speicherverbindungszeichenfolgen. |
Eigenschaft | string |
Ein Schlüssel-Wert-Eigenschaftspaar im Format PropertyName= PropertyValue. Siehe optionale Eigenschaften. |
Hinweis
CSV-Dateien mit nicht identischem Schema können dazu führen, dass Daten verschoben oder fehlen. Es wird empfohlen, CSV-Dateien mit unterschiedlichen Schemas zu trennen, um Speichercontainer zu trennen und eine externe Tabelle für jeden Speichercontainer mit dem richtigen Schema zu definieren.
Tipp
Stellen Sie mehr als ein einzelnes Speicherkonto bereit, um eine Speicherdrosselung beim Exportieren großer Datenmengen in die externe Tabelle zu vermeiden. Beim Export werden die Schreibvorgänge auf alle bereitgestellten Konten verteilt.
Authentifizierung und Autorisierung
Die Authentifizierungsmethode für den Zugriff auf eine externe Tabelle basiert auf dem Verbindungszeichenfolge, der bei der Erstellung bereitgestellt wurde, und die berechtigungen, die für den Zugriff auf die Tabelle erforderlich sind, variieren je nach Authentifizierungsmethode.
In der folgenden Tabelle sind die unterstützten Authentifizierungsmethoden für externe Azure Storage-Tabellen und die Berechtigungen aufgeführt, die zum Lesen oder Schreiben in die Tabelle erforderlich sind.
Authentifizierungsmethode | Azure Blob Storage/Data Lake Storage Gen2 | Data Lake Storage Gen1 |
---|---|---|
Identitätswechsel | Leseberechtigungen: Speicherblobdatenleser Schreibberechtigungen: Mitwirkender für Speicherblobdaten |
Leseberechtigungen: Leser Schreibberechtigungen: Beitrag |
Verwaltete Identität | Leseberechtigungen: Speicherblobdatenleser Schreibberechtigungen: Mitwirkender für Speicherblobdaten |
Leseberechtigungen: Leser Schreibberechtigungen: Beitrag |
SAS-Token (Shared Access) | Leseberechtigungen: Liste + Lesen Schreibberechtigungen: Schreiben |
Diese Authentifizierungsmethode wird in Gen1 nicht unterstützt. |
Microsoft Entra Zugriffstoken | Es sind keine zusätzlichen Berechtigungen erforderlich. | Es sind keine zusätzlichen Berechtigungen erforderlich. |
Speicherkonto-Zugriffsschlüssel | Es sind keine zusätzlichen Berechtigungen erforderlich. | Diese Authentifizierungsmethode wird in Gen1 nicht unterstützt. |
Partitionsformatierung
Die Partitionsliste ist eine beliebige Kombination von Partitionsspalten, die mithilfe eines der in der folgenden Tabelle dargestellten Formulare angegeben wird.
Partitionstyp | Syntax | Hinweise |
---|---|---|
Virtuelle Spalte | Partitionname: (datetime | string ) |
Erfahren Sie mehr über virtuelle Spalten. |
Wert der Zeichenfolgenspalte | Partitionname: string = Columnname |
|
Zeichenfolgenspaltenwerthash | Partitionname: long = hash( Columnname, Anzahl) |
Der Hash ist modulo Number. |
Abgeschnittene datetime-Spalte (Wert) | Partitionname: datetime = (startofyear | startofday startofweek startofmonth | | ) ( ColumnName) |
Weitere Informationen finden Sie in der Dokumentation zu den Funktionen "startofyear", "startofmonth", "startofweek" oder "startofday". |
Abgeschnittener Datetime-Spaltenwert (bin) | Partitionname: datetime = bin ( Columnname, Timespan) |
Weitere Informationen zur bin-Funktion finden Sie hier. |
Pfadformat
Mit dem PathFormat-Parameter können Sie zusätzlich zu Partitionen das Format für den URI-Pfad des externen Datenordners angeben. Es besteht aus einer Sequenz von Partitionselementen und Texttrennzeichen. Ein Partitionselement bezieht sich auf eine Partition, die in der Partitionsklausel by
deklariert ist, und das Texttrennzeichen ist ein beliebiger Text, der in Anführungszeichen eingeschlossen ist. Aufeinanderfolgende Partitionselemente müssen mithilfe des Texttrennzeichens getrennt werden.
[ StringSeparator ] Partition [ StringSeparator ] [Partition [ StringSeparator ] ...]
Zum Erstellen des ursprünglichen Dateipfadpräfixes werden Partitionselemente als Zeichenfolgen gerendert und durch entsprechende Texttrennzeichen getrennt. Sie können das datetime_pattern
Makro (datetime_pattern(
DateTimeFormat,
PartitionName)
) verwenden, um das Format anzugeben, das zum Rendern eines datetime-Partitionswerts verwendet wird. Das Makro entspricht der .NET-Formatspezifikation und ermöglicht das Einschließen von Formatbezeichnern in geschweifte Klammern. Beispielsweise sind die folgenden beiden Formate gleichwertig:
- 'year='jjjj'/month='MM
- year={JJJJ}/month={MM}
Standardmäßig werden datetime-Werte mit den folgenden Formaten gerendert:
Partitionsfunktion | Standardformat |
---|---|
startofyear |
yyyy |
startofmonth |
yyyy/MM |
startofweek |
yyyy/MM/dd |
startofday |
yyyy/MM/dd |
bin( Spalte, 1d) |
yyyy/MM/dd |
bin( Spalte, 1h) |
yyyy/MM/dd/HH |
bin( Spalte, 1m) |
yyyy/MM/dd/HH/mm |
Tipp
Verwenden Sie die -Eigenschaft sampleUris
oder beim Erstellen einer externen Tabelle, um die Richtigkeit der Partitions- und filesPreview
PathFormat-Definition zu überprüfen.
Virtuelle Spalten
Wenn Daten aus Spark exportiert werden, werden Partitionsspalten (die für die Methode des partitionBy
Dataframe writer bereitgestellt werden) nicht in Datendateien geschrieben.
Bei diesem Prozess werden Datenduplizierungen vermieden, column1=<value>/column2=<value>/
da die Daten bereits in den Ordnernamen vorhanden sind (z. B. ), und Spark sie beim Lesen erkennen kann.
Externe Tabellen unterstützen das Lesen dieser Daten in Form von virtual colums
. Virtuelle Spalten können entweder vom Typ string
oder datetime
sein und werden mit der folgenden Syntax angegeben:
.create external table ExternalTable (EventName:string, Revenue:double)
kind=storage
partition by (CustomerName:string, Date:datetime)
pathformat=("customer=" CustomerName "/date=" datetime_pattern("yyyyMMdd", Date))
dataformat=parquet
(
h@'https://storageaccount.blob.core.windows.net/container1;secretKey'
)
Um nach virtuellen Spalten in einer Abfrage zu filtern, geben Sie Partitionsnamen im Abfrage-Prädikat an:
external_table("ExternalTable")
| where Date between (datetime(2020-01-01) .. datetime(2020-02-01))
| where CustomerName in ("John.Doe", "Ivan.Ivanov")
Optionale Eigenschaften
Eigenschaft | Typ | BESCHREIBUNG |
---|---|---|
folder |
string |
Ordner der Tabelle |
docString |
string |
Zeichenfolge zur Dokumentierung der Tabelle |
compressed |
bool |
Wenn festgelegt, gibt an, ob die Dateien als .gz Dateien komprimiert werden (nur im Exportszenario verwendet). |
includeHeaders |
string |
Bei Textformaten mit Trennzeichen (CSV, TSV, ...) gibt an, ob Dateien einen Header enthalten. Mögliche Werte sind: All (alle Dateien enthalten einen Header), FirstFile (die erste Datei in einem Ordner enthält einen Header), None (keine Dateien enthalten einen Header). |
namePrefix |
string |
Wenn festgelegt, gibt das Präfix der Dateien an. Bei Schreibvorgängen werden alle Dateien mit diesem Präfix geschrieben. Bei Lesevorgängen werden nur Dateien mit diesem Präfix gelesen. |
fileExtension |
string |
Wenn festgelegt, gibt dateierweiterungen der Dateien an. Beim Schreiben enden Dateinamen mit diesem Suffix. Beim Lesen werden nur Dateien mit dieser Dateierweiterung gelesen. |
encoding |
string |
Gibt an, wie der Text codiert ist: UTF8NoBOM (Standard) oder UTF8BOM . |
sampleUris |
bool |
Wenn festgelegt, enthält das Befehlsergebnis mehrere Beispiele für simulierte externe Datendateien-URI, wie sie von der definition der externen Tabelle erwartet werden. Mit dieser Option wird überprüft, ob die Parameter Partitions und PathFormat ordnungsgemäß definiert sind. |
filesPreview |
bool |
Wenn festgelegt, enthält eine der Befehlsergebnistabellen eine Vorschau des Befehls ".show external table artifacts ". Wie sampleUri hilft die Option, die Partitions- und PathFormat-Parameter der externen Tabellendefinition zu überprüfen. |
validateNotEmpty |
bool |
Wenn festgelegt, werden die Verbindungszeichenfolgen auf Inhalt überprüft. Der Befehl schlägt fehl, wenn der angegebene URI-Speicherort nicht vorhanden ist oder nicht genügend Berechtigungen für den Zugriff vorhanden sind. |
dryRun |
bool |
Wenn festgelegt, wird die definition der externen Tabelle nicht beibehalten. Diese Option ist nützlich, um die externe Tabellendefinition zu überprüfen, insbesondere in Verbindung mit dem filesPreview Parameter oder sampleUris . |
Hinweis
Auf die externe Tabelle wird während der Erstellung nicht zugegriffen, nur während der Abfrage und beim Export. Verwenden Sie die validateNotEmpty
optionale Eigenschaft während der Erstellung, um sicherzustellen, dass die Tabellendefinition gültig ist und auf den Speicher zugegriffen werden kann.
Tipp
Weitere Informationen zur Rolle namePrefix
und fileExtension
den Eigenschaften, die bei der Datendateifilterung während der Abfrage spielen, finden Sie im Abschnitt Dateifilterlogik .
Logik der Dateifilterung
Beim Abfragen einer externen Tabelle wird die Leistung verbessert, indem irrelevante externe Speicherdateien herausfiltert. Der Prozess des Durchlaufens von Dateien und der Entscheidung, ob eine Datei verarbeitet werden soll, sieht wie folgt aus:
Erstellen Sie ein URI-Muster, das einen Ort darstellt, an dem Dateien gefunden werden. Zunächst entspricht das URI-Muster einem Verbindungszeichenfolge, der als Teil der externen Tabellendefinition bereitgestellt wird. Wenn Partitionen definiert sind, werden sie mit PathFormat gerendert und dann an das URI-Muster angefügt.
Überprüfen Sie für alle Dateien, die unter den erstellten URI-Mustern gefunden wurden:
- Partitionswerte entsprechen Prädikaten, die in einer Abfrage verwendet werden.
- Blobname beginnt mit
NamePrefix
, wenn eine solche Eigenschaft definiert ist. - Blobname endet mit
FileExtension
, wenn eine solche Eigenschaft definiert ist.
Sobald alle Bedingungen erfüllt sind, wird die Datei abgerufen und verarbeitet.
Hinweis
Das anfängliche URI-Muster wird mithilfe von Abfrage-Prädikatwerten erstellt. Dies funktioniert am besten für einen begrenzten Satz von Zeichenfolgenwerten sowie für geschlossene Zeitbereiche.
Beispiele
Nicht partitionierte externe Tabelle
In der folgenden nicht partitionierten externen Tabelle wird erwartet, dass die Dateien direkt unter den definierten Containern platziert werden:
.create external table ExternalTable (x:long, s:string)
kind=storage
dataformat=csv
(
h@'https://storageaccount.blob.core.windows.net/container1;secretKey'
)
Partitioniert nach Datum
In der folgenden externen Tabelle, die nach datum partitioniert ist, werden die Dateien voraussichtlich unter Verzeichnisse des standardformats yyyy/MM/dd
datetime platziert:
.create external table ExternalTable (Timestamp:datetime, x:long, s:string)
kind=storage
partition by (Date:datetime = bin(Timestamp, 1d))
dataformat=csv
(
h@'abfss://filesystem@storageaccount.dfs.core.windows.net/path;secretKey'
)
Partitioniert nach Monat
In der folgenden externen Tabelle, die nach Monat partitioniert ist, lautet year=yyyy/month=MM
das Verzeichnisformat:
.create external table ExternalTable (Timestamp:datetime, x:long, s:string)
kind=storage
partition by (Month:datetime = startofmonth(Timestamp))
pathformat=(datetime_pattern("'year='yyyy'/month='MM", Month))
dataformat=csv
(
h@'https://storageaccount.blob.core.windows.net/container1;secretKey'
)
Partitioniert nach Name und Datum
In der folgenden externen Tabelle werden die Daten zuerst nach Kundenname und dann nach Datum partitioniert, was bedeutet, dass die erwartete Verzeichnisstruktur z. B. customer_name=Softworks/2019/02/01
lautet:
.create external table ExternalTable (Timestamp:datetime, CustomerName:string)
kind=storage
partition by (CustomerNamePart:string = CustomerName, Date:datetime = startofday(Timestamp))
pathformat=("customer_name=" CustomerNamePart "/" Date)
dataformat=csv
(
h@'https://storageaccount.blob.core.windows.net/container1;secretKey'
)
Partitioniert nach Hash und Datum
Die folgende externe Tabelle wird zuerst nach Kundennamenhash (modulo ten) und dann nach Datum partitioniert. Die erwartete Verzeichnisstruktur ist z. B. customer_id=5/dt=20190201
, und die Namen der Datendateien enden mit der .txt
Erweiterung:
.create external table ExternalTable (Timestamp:datetime, CustomerName:string)
kind=storage
partition by (CustomerId:long = hash(CustomerName, 10), Date:datetime = startofday(Timestamp))
pathformat=("customer_id=" CustomerId "/dt=" datetime_pattern("yyyyMMdd", Date))
dataformat=csv
(
h@'https://storageaccount.blob.core.windows.net/container1;secretKey'
)
with (fileExtension = ".txt")
Filtern nach Partitionsspalten in einer Abfrage
Um nach Partitionsspalten in einer Abfrage zu filtern, geben Sie den ursprünglichen Spaltennamen im Abfrageprdikat an:
external_table("ExternalTable")
| where Timestamp between (datetime(2020-01-01) .. datetime(2020-02-01))
| where CustomerName in ("John.Doe", "Ivan.Ivanov")
Beispielausgabe
TableName | TableType | Ordner | DocString | Eigenschaften | ConnectionStrings | Partitionen | PathFormat |
---|---|---|---|---|---|---|---|
ExternalTable | Blob | ExternalTables | Docs | {"Format":"Csv","Compressed":false,"CompressionType":null,"FileExtension":null,"IncludeHeaders":"None","Encoding":null,"NamePrefix":null} | ["https://storageaccount.blob.core.windows.net/container1;*******"] | [{"mod":10,"Name":"CustomerId","ColumnName":"CustomerName","Ordinal":0},{"Function":"StartOfDay","Name":"Date","ColumnName":"Timestamp","Ordinal":1}] | "customer_id=" CustomerId "/dt=" datetime_pattern("yyyMMdd",Date) |
Verwandte Inhalte
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für