Tworzenie i zmienianie tabel zewnętrznych usługi Azure Storage
Polecenia w tym artykule mogą służyć do tworzenia lub zmieniania zewnętrznej tabeli usługi Azure Storage w bazie danych, z której jest wykonywane polecenie. Tabela zewnętrzna usługi Azure Storage odwołuje się do danych znajdujących się w Azure Blob Storage, azure Data Lake Store Gen1 lub Azure Data Lake Store Gen2.
Uwaga
Jeśli tabela istnieje, .create
polecenie zakończy się niepowodzeniem z powodu błędu. Użyj .create-or-alter
polecenia lub .alter
zmodyfikuj istniejące tabele.
Uprawnienia
Aby .create
wymagać co najmniej uprawnień użytkownika bazy danych i .alter
wymaga co najmniej uprawnień tabeli Administracja.
Do .create-or-alter
tabeli zewnętrznej przy użyciu uwierzytelniania tożsamości zarządzanej wymagane są uprawnienia AllDatabasesAdmin .
Składnia
(.create
| .alter
.create-or-alter
| ) external
table
Schemat)
=
kind
storage
TableName(
[Partycje)
[pathformat
partition
(
=
(
by
PathFormat]] dataformat
=
DataFormat(
)
StorageConnectionString [,
...] )
[with
(
Właściwość [,
...])
]
Uwaga
kind
jest przeznaczony storage
dla wszystkich typów zewnętrznych magazynów danych usługi Azure Storage. blob
i adl
są przestarzałymi terminami.
Dowiedz się więcej o konwencjach składniowych.
Parametry
Nazwa | Typ | Wymagane | Opis |
---|---|---|---|
TableName | string |
✔️ | Nazwa tabeli zewnętrznej zgodna z regułami nazw jednostek . Tabela zewnętrzna nie może mieć takiej samej nazwy jak zwykła tabela w tej samej bazie danych. |
Schemat | string |
✔️ | Schemat danych zewnętrznych jest rozdzielaną przecinkami listą co najmniej jednej nazwy kolumn i typów danych, gdzie każdy element jest zgodny z formatem ColumnName: ColumnType. Jeśli schemat jest nieznany, użyj infer_storage_schema , aby wywnioskować schemat na podstawie zawartości pliku zewnętrznego. |
Partycji | string |
Rozdzielona przecinkami lista kolumn, według których tabela zewnętrzna jest podzielona na partycje. Kolumna partycji może istnieć w samym pliku danych lub w ramach ścieżki pliku. Zobacz formatowanie partycji, aby dowiedzieć się, jak powinna wyglądać ta wartość. | |
PathFormat | string |
Format ścieżki identyfikatora URI folderu danych zewnętrznych do użycia z partycjami. Zobacz format ścieżki. | |
Dataformat | string |
✔️ | Format danych, który może być dowolnym formatem pozyskiwania. Zalecamy użycie Parquet formatu tabel zewnętrznych w celu zwiększenia wydajności zapytań i eksportowania, chyba że używasz JSON mapowania ścieżek. W przypadku korzystania z tabeli zewnętrznej dla scenariusza eksportu są ograniczone do następujących formatów: CSV , TSV i JSON Parquet . |
StorageConnectionString | string |
✔️ | Co najmniej jedna ścieżka rozdzielona przecinkami w celu Azure Blob Storage kontenerów obiektów blob, systemów plików usługi Azure Data Lake Gen 2 lub kontenerów usługi Azure Data Lake Gen 1, w tym poświadczeń. Typ zewnętrznego magazynu tabel zależy od podanych parametrów połączenia. Zobacz Parametry połączenia magazynu. |
Właściwość | string |
Para właściwości klucz-wartość w formacie PropertyName= PropertyValue. Zobacz właściwości opcjonalne. |
Uwaga
Pliki CSV z nie identycznym schematem mogą spowodować wyświetlenie danych przeniesionych lub brakujących. Zalecamy oddzielenie plików CSV z odrębnymi schematami w celu oddzielenia kontenerów magazynu i zdefiniowania tabeli zewnętrznej dla każdego kontenera magazynu przy użyciu odpowiedniego schematu.
Porada
Zapewnij więcej niż jedno konto magazynu, aby uniknąć ograniczania przepustowości magazynu podczas eksportowania dużych ilości danych do tabeli zewnętrznej. Eksport będzie dystrybuować zapisy między wszystkimi podanymi kontami.
Uwierzytelnianie i autoryzacja
Metoda uwierzytelniania dostępu do tabeli zewnętrznej jest oparta na parametry połączenia podanym podczas tworzenia, a uprawnienia wymagane do uzyskania dostępu do tabeli różnią się w zależności od metody uwierzytelniania.
W poniższej tabeli wymieniono obsługiwane metody uwierzytelniania dla tabel zewnętrznych usługi Azure Storage oraz uprawnienia wymagane do odczytu lub zapisu w tabeli.
Metoda uwierzytelniania | Azure Blob Storage/Data Lake Storage Gen2 | Data Lake Storage Gen1 |
---|---|---|
Personifikacja | Uprawnienia do odczytu: Czytelnik danych obiektów blob usługi Storage Uprawnienia do zapisu: Współautor danych obiektu blob usługi Storage |
Uprawnienia do odczytu: Czytnik Uprawnienia do zapisu: Współautorów |
Tożsamość zarządzana | Uprawnienia do odczytu: Czytelnik danych obiektów blob usługi Storage Uprawnienia do zapisu: Współautor danych obiektu blob usługi Storage |
Uprawnienia do odczytu: Czytnik Uprawnienia do zapisu: Współautorów |
Token dostępu współdzielonego (SAS) | Uprawnienia do odczytu: Lista i odczyt Uprawnienia do zapisu: Napisz |
Ta metoda uwierzytelniania nie jest obsługiwana w usłudze Gen1. |
Microsoft Entra token dostępu | Nie są wymagane żadne dodatkowe uprawnienia. | Nie są wymagane żadne dodatkowe uprawnienia. |
Klucz dostępu do konta magazynu | Nie są wymagane żadne dodatkowe uprawnienia. | Ta metoda uwierzytelniania nie jest obsługiwana w usłudze Gen1. |
Formatowanie partycji
Lista partycji to dowolna kombinacja kolumn partycji określona przy użyciu jednej z formularzy przedstawionych w poniższej tabeli.
Typ partycji | Składnia | Uwagi |
---|---|---|
Kolumna wirtualna | PartitionName: (datetime | string ) |
Przeczytaj więcej na temat kolumn wirtualnych. |
Wartość kolumny ciągu | PartitionName: string = Columnname |
|
Skrót wartości kolumny ciągu | PartitionName: long = hash( Columnname, Numer) |
Skrót jest numerem modulo. |
Obcięta kolumna daty/godziny (wartość) | PartitionName: datetime = (startofyear | startofday startofweek startofmonth | | ) ( Nazwa kolumny) |
Zobacz dokumentację dotyczącą funkcji startofyear, startofmonth, startofweek lub startofday . |
Obcięta wartość kolumny daty/godziny (bin) | PartitionName: datetime = bin ( Columnname, Timespan) |
Przeczytaj więcej na temat funkcji bin . |
Format ścieżki
Parametr PathFormat umożliwia określenie formatu ścieżki identyfikatora URI folderu danych zewnętrznych oprócz partycji. Składa się z sekwencji elementów partycji i separatorów tekstu. Element partycji odwołuje się do partycji zadeklarowanej w klauzuli partycji by
, a separator tekstu to dowolny tekst ujęta w cudzysłów. Kolejne elementy partycji należy ustawić oddzielnie przy użyciu separatora tekstu.
[ StringSeparator ] Partition [ StringSeparator ] [Partition [ StringSeparator ] ...]
Aby utworzyć oryginalny prefiks ścieżki pliku, elementy partycji są renderowane jako ciągi i oddzielone odpowiednimi separatorami tekstu. Możesz użyć datetime_pattern
makra (datetime_pattern(
DateTimeFormat,
PartitionName)
), aby określić format używany do renderowania wartości partycji datetime. Makro jest zgodne ze specyfikacją formatu .NET i umożliwia ujęcie specyfikatorów formatu w nawiasy klamrowe. Na przykład następujące dwa formaty są równoważne:
- 'year='yy'/month='MM
- year={rrrr}/month={MM}
Domyślnie wartości daty/godziny są renderowane przy użyciu następujących formatów:
Partition — Funkcja | Format domyślny |
---|---|
startofyear |
yyyy |
startofmonth |
yyyy/MM |
startofweek |
yyyy/MM/dd |
startofday |
yyyy/MM/dd |
bin( Kolumna, 1d) |
yyyy/MM/dd |
bin( Kolumna, 1h) |
yyyy/MM/dd/HH |
bin( Kolumna, 1m) |
yyyy/MM/dd/HH/mm |
Porada
Aby sprawdzić poprawność definicji Partitions and PathFormat , użyj właściwości sampleUris
lub filesPreview
podczas tworzenia tabeli zewnętrznej.
Kolumny wirtualne
Gdy dane są eksportowane z platformy Spark, kolumny partycji (dostarczane do metody modułu zapisywania partitionBy
ramki danych) nie są zapisywane w plikach danych.
Ten proces unika duplikowania danych, ponieważ dane są już obecne w nazwach folderów (na przykład column1=<value>/column2=<value>/
), a platforma Spark może rozpoznać je podczas odczytu.
Tabele zewnętrzne obsługują odczytywanie tych danych w postaci virtual colums
. Kolumny wirtualne mogą być typu string
lub datetime
, i są określone przy użyciu następującej składni:
.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'
)
Aby filtrować według kolumn wirtualnych w zapytaniu, określ nazwy partycji w predykacie zapytania:
external_table("ExternalTable")
| where Date between (datetime(2020-01-01) .. datetime(2020-02-01))
| where CustomerName in ("John.Doe", "Ivan.Ivanov")
Właściwości opcjonalne
Właściwość | Typ | Opis |
---|---|---|
folder |
string |
Folder tabeli |
docString |
string |
Ciąg dokumentujący tabelę |
compressed |
bool |
W przypadku ustawienia wskazuje, czy pliki są kompresowane jako .gz pliki (używane tylko w scenariuszu eksportu ) |
includeHeaders |
string |
W przypadku formatów tekstu rozdzielanego (CSV, TSV, ...) wskazuje, czy pliki zawierają nagłówek. Możliwe wartości to: All (wszystkie pliki zawierają nagłówek), FirstFile (pierwszy plik w folderze zawiera nagłówek), None (żadne pliki nie zawierają nagłówka). |
namePrefix |
string |
W przypadku ustawienia wskazuje prefiks plików. W przypadku operacji zapisu wszystkie pliki zostaną zapisane przy użyciu tego prefiksu. W przypadku operacji odczytu tylko pliki z tym prefiksem są odczytywane. |
fileExtension |
string |
W przypadku ustawienia wskazuje rozszerzenia plików. Na zapisie nazwy plików zakończą się tym sufiksem. W przypadku odczytu będą odczytywane tylko pliki z tym rozszerzeniem pliku. |
encoding |
string |
Wskazuje, jak tekst jest zakodowany: UTF8NoBOM (wartość domyślna) lub UTF8BOM . |
sampleUris |
bool |
W przypadku ustawienia wynik polecenia zawiera kilka przykładów symulowanych identyfikatorów URI plików danych zewnętrznych zgodnie z oczekiwaniami definicji tabeli zewnętrznej. Ta opcja pomaga sprawdzić, czy parametry Partitions i PathFormat są poprawnie zdefiniowane. |
filesPreview |
bool |
W przypadku ustawienia jedna z tabel wyników polecenia zawiera podgląd polecenia .show external table artifacts . Podobnie jak sampleUri , opcja pomaga zweryfikować parametry Partitions i PathFormat definicji tabeli zewnętrznej. |
validateNotEmpty |
bool |
W przypadku ustawienia parametry połączenia są weryfikowane pod kątem zawartości w nich. Polecenie zakończy się niepowodzeniem, jeśli określona lokalizacja identyfikatora URI nie istnieje lub jeśli nie ma wystarczających uprawnień dostępu do niego. |
dryRun |
bool |
W przypadku ustawienia definicja tabeli zewnętrznej nie jest utrwalana. Ta opcja jest przydatna do sprawdzania poprawności definicji tabeli zewnętrznej, szczególnie w połączeniu z parametrem filesPreview lub sampleUris . |
Uwaga
Tabela zewnętrzna nie jest dostępna podczas tworzenia, tylko podczas wykonywania zapytań i eksportowania. Użyj właściwości opcjonalnej validateNotEmpty
podczas tworzenia, aby upewnić się, że definicja tabeli jest prawidłowa, a magazyn jest dostępny.
Porada
Aby dowiedzieć się więcej na temat roli namePrefix
i fileExtension
właściwości odgrywanych w filtrowaniu plików danych podczas wykonywania zapytania, zobacz sekcję logiki filtrowania plików .
Logika filtrowania plików
Podczas wykonywania zapytań względem tabeli zewnętrznej wydajność jest większa przez filtrowanie nieistotnych plików magazynu zewnętrznego. Proces iterowania plików i decydowania, czy plik powinien zostać przetworzony, jest następujący:
Utwórz wzorzec identyfikatora URI, który reprezentuje miejsce, w którym znajdują się pliki. Początkowo wzorzec identyfikatora URI odpowiada parametry połączenia podanej jako część definicji tabeli zewnętrznej. Jeśli istnieją zdefiniowane partycje, są renderowane przy użyciu parametru PathFormat, a następnie dołączane do wzorca identyfikatora URI.
W przypadku wszystkich plików znalezionych w utworzonych wzorcach identyfikatora URI sprawdź, czy:
- Wartości partycji są zgodne z predykatami używanymi w zapytaniu.
- Nazwa obiektu blob zaczyna się od
NamePrefix
, jeśli taka właściwość jest zdefiniowana. - Nazwa obiektu blob kończy się ciągiem
FileExtension
, jeśli taka właściwość jest zdefiniowana.
Po spełnieniu wszystkich warunków plik zostanie pobrany i przetworzony.
Uwaga
Początkowy wzorzec identyfikatora URI jest kompilowany przy użyciu wartości predykatu zapytania. Najlepiej sprawdza się w przypadku ograniczonego zestawu wartości ciągów, a także dla zamkniętych zakresów czasu.
Przykłady
Tabela zewnętrzna bez partycjonowania
W poniższej tabeli zewnętrznej bez partycji pliki powinny zostać umieszczone bezpośrednio w zdefiniowanych kontenerach:
.create external table ExternalTable (x:long, s:string)
kind=storage
dataformat=csv
(
h@'https://storageaccount.blob.core.windows.net/container1;secretKey'
)
Partycjonowane według daty
W poniższej tabeli zewnętrznej partycjonowanej według daty pliki mają być umieszczane w katalogach domyślnego formatu yyyy/MM/dd
daty/godziny:
.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'
)
Partycjonowane według miesięcy
W poniższej tabeli zewnętrznej podzielonej na partycje według miesiąca format katalogu to year=yyyy/month=MM
:
.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'
)
Partycjonowane według nazwy i daty
W poniższej tabeli zewnętrznej dane są najpierw partycjonowane według nazwy klienta, a następnie według daty, co oznacza, że oczekiwana struktura katalogów jest na customer_name=Softworks/2019/02/01
przykład :
.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'
)
Partycjonowane według wartości skrótu i daty
Poniższa tabela zewnętrzna jest podzielona na partycje według skrótu nazwy klienta (modulo dziesięć), a następnie według daty. Oczekiwana struktura katalogów to na przykład , customer_id=5/dt=20190201
a nazwy plików danych kończą się .txt
rozszerzeniem:
.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")
Filtrowanie według kolumn partycji w zapytaniu
Aby filtrować według kolumn partycji w zapytaniu, określ oryginalną nazwę kolumny w predykacie zapytania:
external_table("ExternalTable")
| where Timestamp between (datetime(2020-01-01) .. datetime(2020-02-01))
| where CustomerName in ("John.Doe", "Ivan.Ivanov")
Przykładowe dane wyjściowe
TableName | TableType | Folder | DocString | Właściwości | Connectionstrings | Partycje | PathFormat |
---|---|---|---|---|---|---|---|
Tabela zewnętrzna | Obiekt blob | Tabele zewnętrzne | 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) |
Zawartość pokrewna
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla