Vytváření a změny externích tabulek služby Azure Storage
Příkazy v tomto článku můžete použít k vytvoření nebo změně externí tabulky Azure Storage v databázi, ze které se příkaz spouští. Externí tabulka Azure Storage odkazuje na data umístěná v Azure Blob Storage, Azure Data Lake Store Gen1 nebo Azure Data Lake Store Gen2.
Poznámka
Pokud tabulka existuje, .create
příkaz selže s chybou. Slouží .create-or-alter
k úpravě existujících tabulek nebo .alter
.
Oprávnění
Vyžaduje .create
alespoň uživatelská oprávnění databáze a .alter
minimálně oprávnění Správa tabulky.
K .create-or-alter
externí tabulce s využitím ověřování spravované identity se vyžaduje oprávnění AllDatabasesAdmin .
Syntax
(.create
.alter
| .create-or-alter
| ) external
table
TableName(
Schema)
=
storage
kind
[partition
by
(
Partitions)
[pathformat
(
=
PathFormat)
]] dataformat
=
DataFormat(
StorageConnectionString [,
...] )
[with
(
Vlastnost [,
...])
]
Poznámka
kind
je storage
pro všechny typy externích úložišť dat Azure Storage. blob
a adl
jsou zastaralé termíny.
Přečtěte si další informace o konvencích syntaxe.
Parametry
Název | Typ | Vyžadováno | Popis |
---|---|---|---|
TableName | string |
✔️ | Název externí tabulky, který dodržuje pravidla názvů entit . Externí tabulka nemůže mít stejný název jako běžná tabulka ve stejné databázi. |
Schéma | string |
✔️ | Schéma externích dat je seznam jednoho nebo více názvů sloupců a datových typů oddělených čárkami, kde každá položka má formát ColumnName: ColumnType. Pokud je schéma neznámé, použijte infer_storage_schema k odvození schématu na základě obsahu externího souboru. |
Oddíly | string |
Seznam sloupců oddělených čárkami, podle kterých je externí tabulka rozdělená na oddíly. Sloupec oddílu může existovat v samotném datovém souboru nebo jako součást cesty k souboru. Informace o tom, jak by tato hodnota měla vypadat, najdete v tématu Formátování oddílů . | |
PathFormat | string |
Formát cesty URI externí složky dat pro použití s oddíly. Viz formát cesty. | |
Dataformat | string |
✔️ | Formát dat, kterým může být kterýkoli z formátů příjmu dat. Pokud nepoužíváte JSON mapování cest, doporučujeme pro externí tabulky použít Parquet formát pro zvýšení výkonu dotazů a exportu. Při použití externí tabulky pro scénář exportu jste omezeni na následující formáty: CSV , TSV JSON a Parquet . |
StorageConnectionString | string |
✔️ | Jedna nebo více cest oddělených čárkami k Azure Blob Storage kontejnery objektů blob, systémy souborů Azure Data Lake Gen2 nebo kontejnery Azure Data Lake Gen1, včetně přihlašovacích údajů. Typ úložiště externí tabulky je určen zadanými připojovacími řetězci. Viz připojovací řetězce úložiště. |
Vlastnost | string |
Pár vlastnosti klíč-hodnota ve formátu PropertyName= PropertyValue. Viz volitelné vlastnosti. |
Poznámka
Soubory CSV s neidentickým schématem můžou mít za následek posunutá nebo chybějící data. Doporučujeme oddělit soubory CSV s odlišnými schématy, aby se oddělily kontejnery úložiště, a definovat externí tabulku pro každý kontejner úložiště se správným schématem.
Tip
Poskytněte více než jeden účet úložiště, abyste se vyhnuli omezování úložiště při exportu velkých objemů dat do externí tabulky. Export distribuuje zápisy mezi všechny zadané účty.
Ověřování a autorizace
Metoda ověřování pro přístup k externí tabulce je založená na připojovací řetězec zadané při jejím vytváření a oprávnění požadovaná pro přístup k tabulce se liší v závislosti na metodě ověřování.
Následující tabulka uvádí podporované metody ověřování pro externí tabulky Azure Storage a oprávnění potřebná ke čtení nebo zápisu do tabulky.
Metoda ověřování | Azure Blob Storage / Data Lake Storage Gen2 | Data Lake Storage Gen1 |
---|---|---|
Zosobnění | Oprávnění ke čtení: Čtenář dat objektů blob služby Storage Oprávnění k zápisu: Přispěvatel dat v objektech blob služby Storage |
Oprávnění ke čtení: Čtenář Oprávnění k zápisu: Přispěvatelů |
Spravovaná identita | Oprávnění ke čtení: Čtenář dat objektů blob služby Storage Oprávnění k zápisu: Přispěvatel dat v objektech blob služby Storage |
Oprávnění ke čtení: Čtenář Oprávnění k zápisu: Přispěvatelů |
Token sdíleného přístupu (SAS) | Oprávnění ke čtení: Seznam + čtení Oprávnění k zápisu: Zápis |
Tato metoda ověřování není v Gen1 podporovaná. |
Microsoft Entra přístupový token | Nevyžadují se žádná další oprávnění. | Nevyžadují se žádná další oprávnění. |
Přístupový klíč účtu úložiště | Nevyžadují se žádná další oprávnění. | Tato metoda ověřování není v Gen1 podporovaná. |
Formátování oddílů
Seznam oddílů je libovolná kombinace sloupců oddílů zadaná pomocí některého z formulářů uvedených v následující tabulce.
Typ oddílu | Syntax | Poznámky |
---|---|---|
Virtuální sloupec | Název oddílu: (datetime | string ) |
Přečtěte si další informace o virtuálních sloupcích. |
Hodnota sloupce řetězce | Název oddílu: string = Columnname |
|
Hodnota hash sloupce řetězce | Název oddílu: long = hash( Columnname, Číslo) |
Hodnota hash je modulo Number. |
Zkrácený sloupec datetime (hodnota) | Název oddílu: datetime = (startofyear | startofday startofweek startofmonth | | ) ( Název sloupce) |
Projděte si dokumentaci k funkcím startofyear, startofmonth, startofweek nebo startofday . |
Zkrácená hodnota sloupce Datetime (bin) | Název oddílu: datetime = bin ( Columnname, Timespan) |
Přečtěte si další informace o funkci bin . |
Formát cesty
Parametr PathFormat umožňuje zadat kromě oddílů i formát cesty URI složky externích dat. Skládá se z posloupnosti prvků oddílu a oddělovačů textu. Element partition odkazuje na oddíl, který je deklarován v klauzuli oddílu by
, a oddělovač textu je libovolný text uzavřený v uvozovkách. Prvky po sobě jdoucích oddílů musí být odděleny pomocí oddělovače textu.
[ StringSeparator ] Partition [ StringSeparator ] [Partition [ StringSeparator ] ...]
K vytvoření předpony původní cesty k souboru se elementy oddílů vykreslují jako řetězce a oddělují se odpovídajícími oddělovači textu. Pomocí makra (datetime_pattern(
DateTimeFormat,
PartitionName)
) můžete datetime_pattern
určit formát použitý pro vykreslení hodnoty oddílu datetime. Makro dodržuje specifikaci formátu .NET a umožňuje specifikátory formátu uzavřít do složených závorek. Například následující dva formáty jsou ekvivalentní:
- 'year='yyyy'/month='MM
- year={yyyy}/month={MM}
Ve výchozím nastavení se hodnoty datetime vykreslují pomocí následujících formátů:
Partition – funkce | Výchozí formát |
---|---|
startofyear |
yyyy |
startofmonth |
yyyy/MM |
startofweek |
yyyy/MM/dd |
startofday |
yyyy/MM/dd |
bin( Sloupec, 1d) |
yyyy/MM/dd |
bin( Sloupec, 1h) |
yyyy/MM/dd/HH |
bin( Sloupec, 1m) |
yyyy/MM/dd/HH/mm |
Tip
Pokud chcete zkontrolovat správnost definice Oddílů a PathFormat , použijte vlastnost sampleUris
nebo filesPreview
při vytváření externí tabulky.
Virtuální sloupce
Při exportu dat ze Sparku se do datových souborů nezapisují sloupce oddílů (které jsou poskytovány metodě zapisovače datového partitionBy
rámce).
Tento proces zabrání duplikaci dat, column1=<value>/column2=<value>/
protože data už jsou v názvech složek (například ) a Spark je při čtení rozpozná.
Externí tabulky podporují čtení těchto dat ve formě virtual colums
. Virtuální sloupce můžou být typu string
nebo datetime
a zadává se pomocí následující syntaxe:
.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'
)
Pokud chcete v dotazu filtrovat podle virtuálních sloupců, zadejte názvy oddílů v predikátu dotazu:
external_table("ExternalTable")
| where Date between (datetime(2020-01-01) .. datetime(2020-02-01))
| where CustomerName in ("John.Doe", "Ivan.Ivanov")
Volitelné vlastnosti
Vlastnost | Typ | Description |
---|---|---|
folder |
string |
Složka tabulky |
docString |
string |
Řetězec dokumentující tabulku |
compressed |
bool |
Pokud je nastaveno, označuje, jestli jsou soubory komprimované jako .gz soubory (používá se pouze ve scénáři exportu ). |
includeHeaders |
string |
U textových formátů s oddělovači (CSV, TSV, ...) označuje, jestli soubory obsahují hlavičku. Možné hodnoty jsou: All (všechny soubory obsahují záhlaví), FirstFile (první soubor ve složce obsahuje záhlaví) None (žádné soubory neobsahují záhlaví). |
namePrefix |
string |
Pokud je nastaveno, označuje předponu souborů. Při operacích zápisu budou všechny soubory zapsány s touto předponou. Při operacích čtení se čtou jenom soubory s touto předponou. |
fileExtension |
string |
Pokud je nastavená, označuje přípony souborů. Při zápisu budou názvy souborů končit touto příponou. Při čtení se budou číst jenom soubory s touto příponou. |
encoding |
string |
Označuje, jak je text zakódován: UTF8NoBOM (výchozí) nebo UTF8BOM . |
sampleUris |
bool |
Pokud je nastaveno, výsledek příkazu poskytuje několik příkladů simulovaného identifikátoru URI externích datových souborů podle očekávání v definici externí tabulky. Tato možnost pomáhá ověřit, jestli jsou správně definovány parametry Partitions a PathFormat . |
filesPreview |
bool |
Pokud je tato možnost nastavená, jedna z tabulek výsledků příkazu obsahuje náhled příkazu .show external table artifacts . Podobně jako sampleUri možnost pomáhá ověřit parametry Partitions a PathFormat definice externí tabulky. |
validateNotEmpty |
bool |
Pokud je tato možnost nastavená, připojovací řetězce se ověří, jestli jsou v nich obsah. Příkaz selže, pokud zadané umístění identifikátoru URI neexistuje nebo pokud nemáte dostatečná oprávnění pro přístup k němu. |
dryRun |
bool |
Pokud je tato možnost nastavená, definice externí tabulky se neuchová. Tato možnost je užitečná při ověřování definice externí tabulky, zejména ve spojení s parametrem filesPreview nebo sampleUris . |
Poznámka
Externí tabulka není přístupná během vytváření, pouze během dotazu a exportu. validateNotEmpty
Při vytváření použijte volitelnou vlastnost a ujistěte se, že je definice tabulky platná a úložiště je přístupné.
Tip
Další informace o roli namePrefix
a fileExtension
vlastnostech při filtrování datových souborů během dotazu najdete v části Logika filtrování souborů .
Logika filtrování souborů
Při dotazování externí tabulky se výkon zlepšuje filtrováním irelevantních externích souborů úložiště. Proces iterace souborů a rozhodování, jestli se má soubor zpracovat, je následující:
Vytvořte vzor identifikátoru URI, který představuje místo, kde se nacházejí soubory. Zpočátku se vzor identifikátoru URI rovná připojovací řetězec poskytnuté jako součást definice externí tabulky. Pokud jsou definovány nějaké oddíly, vykreslí se pomocí PathFormat a pak se připojí ke vzoru identifikátoru URI.
U všech souborů nalezených v rámci vytvořených vzorů identifikátorů URI zkontrolujte, že:
- Hodnoty oddílů odpovídají predikátům použitým v dotazu.
- Název objektu blob začíná na
NamePrefix
, pokud je taková vlastnost definovaná. - Název objektu blob končí na
FileExtension
, pokud je taková vlastnost definovaná.
Po splnění všech podmínek se soubor načte a zpracuje.
Poznámka
Vzor počátečního identifikátoru URI se sestavuje pomocí hodnot predikátu dotazu. To funguje nejlépe pro omezenou sadu řetězcových hodnot i pro uzavřené časové rozsahy.
Příklady
Externí tabulka bez oddílů
V následující externí tabulce bez oddílů se očekává umístění souborů přímo do definovaných kontejnerů:
.create external table ExternalTable (x:long, s:string)
kind=storage
dataformat=csv
(
h@'https://storageaccount.blob.core.windows.net/container1;secretKey'
)
Dělené podle data
V následující externí tabulce rozdělené podle data se očekává umístění souborů do adresářů výchozího formátu yyyy/MM/dd
datetime:
.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'
)
Dělené podle měsíců
V následující externí tabulce rozdělené podle měsíců je year=yyyy/month=MM
formát adresáře :
.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'
)
Dělené podle názvu a data
V následující externí tabulce jsou data rozdělena nejprve podle jména zákazníka a potom podle data, což znamená, že očekávaná adresářová struktura je například customer_name=Softworks/2019/02/01
:
.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'
)
Dělené podle hodnoty hash a data
Následující externí tabulka se nejprve rozdělí podle hodnoty hash názvu zákazníka (modulo ten) a pak podle data. Očekávaná adresářová struktura je například customer_id=5/dt=20190201
, a názvy datových souborů končí příponou .txt
:
.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")
Filtrování podle sloupců oddílů v dotazu
Pokud chcete v dotazu filtrovat podle sloupců oddílů, zadejte původní název sloupce v predikátu dotazu:
external_table("ExternalTable")
| where Timestamp between (datetime(2020-01-01) .. datetime(2020-02-01))
| where CustomerName in ("John.Doe", "Ivan.Ivanov")
Ukázkový výstup
TableName | TableType | Složka | DocString | Vlastnosti | Connectionstrings | Oddíly | PathFormat |
---|---|---|---|---|---|---|---|
Externí tabulka | Objekt blob | Externí tabulky | 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("yyyyMMdd",Date) |
Související obsah
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro