Sdílené tabulky metadat služby Azure Synapse Analytics
Azure Synapse Analytics umožňuje různým výpočetním modulům pracovního prostoru sdílet databáze a tabulky mezi fondy Apache Sparku a bezserverovým fondem SQL.
Jakmile je databáze vytvořená úlohou Sparku, můžete v ní vytvářet tabulky, které jako formát úložiště používají Parquet, Delta nebo CSV. Názvy tabulek budou převedeny na malá písmena a musí být dotazovány pomocí názvu malého písmena. Tyto tabulky se okamžitě zpřístupní pro dotazování libovolným fondem Sparku pracovního prostoru Azure Synapse. Dají se také použít z libovolné úlohy Sparku, které podléhají oprávněním.
Vytvořené, spravované a externí tabulky Sparku jsou také dostupné jako externí tabulky se stejným názvem v odpovídající synchronizované databázi v bezserverovém fondu SQL. Zveřejnění tabulky Spark v SQL poskytuje podrobnější informace o synchronizaci tabulek.
Vzhledem k tomu, že se tabulky synchronizují s bezserverovým fondem SQL asynchronně, dojde k malému zpoždění, dokud se nezobrazí.
Správa vytvořené tabulky Sparku
Ke správě vytvořených databází Sparku použijte Spark. Odstraňte ho například prostřednictvím úlohy bezserverového fondu Apache Sparku a vytvořte v ní tabulky ze Sparku.
Objekty v synchronizovaných databázích nelze upravovat z bezserverového fondu SQL.
Zveřejnění tabulky Spark v SQL
Sdílené tabulky Sparku
Spark poskytuje dva typy tabulek, které Azure Synapse zveřejňuje v SQL automaticky:
Spravované tabulky
Spark nabízí řadu možností ukládání dat do spravovaných tabulek, jako je TEXT, CSV, JSON, JDBC, PARQUET, ORC, HIVE, DELTA a LIBSVM. Tyto soubory jsou obvykle uloženy v
warehouse
adresáři, ve kterém jsou uložena data spravované tabulky.Externí tabulky
Spark také poskytuje způsoby, jak vytvořit externí tabulky nad existujícími daty, a to buď poskytnutím
LOCATION
možnosti, nebo použitím formátu Hive. Tyto externí tabulky můžou být v různých datových formátech, včetně Parquet.
Azure Synapse v současné době sdílí jenom spravované a externí tabulky Sparku, které ukládají svá data ve formátu Parquet, DELTA nebo CSV s moduly SQL. Tabulky zálohované jinými formáty se automaticky nesynchronizují. Pokud modul SQL podporuje základní formát tabulky, můžete takové tabulky explicitně synchronizovat sami jako externí tabulku ve vlastní databázi SQL.
Poznámka:
V současné době se v bezserverovém fondu SQL plně podporují jenom formáty Parquet a CSV. Tabulky Spark Delta jsou také dostupné v bezserverovém fondu SQL, ale tato funkce je ve verzi Public Preview. Externí tabulky vytvořené ve Sparku nejsou k dispozici ve vyhrazených databázích fondu SQL.
Sdílení tabulek Sparku
Spravované a externí tabulky Sparku zveřejněné v modulu SQL jako externí tabulky s následujícími vlastnostmi:
- Zdrojem dat externí tabulky SQL je zdroj dat představující složku umístění tabulky Spark.
- Formát souboru externí tabulky SQL je Parquet, Delta nebo CSV.
- Přihlašovací údaje pro přístup k externí tabulce SQL jsou předávané.
Vzhledem k tomu, že všechny názvy tabulek Sparku jsou platné názvy tabulek SQL a všechny názvy sloupců Sparku jsou platné názvy sloupců SQL, pro externí tabulku SQL se použijí názvy tabulek Spark a sloupců.
Tabulky Sparku poskytují různé datové typy než moduly Synapse SQL. Následující tabulka mapuje datové typy tabulek Sparku na typy SQL:
Datový typ Spark | Datový typ SQL | Komentáře |
---|---|---|
LongType , , long bigint |
bigint |
Spark: LongType představuje celočíselná čísla se 8 bajty. SQL: Viz int, bigint, smallint a tinyint. |
BooleanType , boolean |
bit (Parquet), varchar(6) (CSV) |
Spark: Logická hodnota. SQL: Viz [/sql/t-sql/data-types/bit-transact-sql). |
DecimalType , decimal , , dec numeric |
decimal |
Spark: DecimalType představuje desetinná čísla s libovolnou přesností podepsanou desetinnou čárkou. Interní zálohování pomocí java.math.BigDecimal. BigDecimal se skládá z libovolné přesnosti celé číslo bez měřítka a 32bitového celočíselného měřítka. SQL: Pevná přesnost a čísla škálování Při použití maximální přesnosti jsou platné hodnoty od - 10^38 +1 až 10^38 - 1. Synonyma ISO pro desetinná místa jsou dec a dec(p, s). numeric je funkčně identický s desítkovým číslem. Viz desetinné číslo a desetinné číslo. |
IntegerType , , Integer int |
int |
Spark IntegerType představuje 4 bajtová celočíselná čísla. SQL: Viz int, bigint, smallint a tinyint. |
ByteType , , Byte tinyint |
smallint |
Spark: ByteType představuje 1 bajtová celočíselná čísla [-128 až 127] a ShortType představuje 2 bajtová celočíselná čísla [-32768 až 32767]. SQL: Tinyint představuje 1 bajtová celočíselná čísla [0, 255] a smallint představuje 2 bajtová celočíselná čísla [-32768, 32767]. Podívejte se na int, bigint, smallint a tinyint. |
ShortType , , Short smallint |
smallint |
Platí to samé jako výše. |
DoubleType , Double |
float |
Spark: DoubleType představuje čísla s plovoucí desetinnou čárkou s dvojitou přesností 8 bajtů. SQL: Viz float a real. |
FloatType , , float real |
real |
Spark: FloatType představuje čísla s plovoucí desetinnou čárkou 4babajtů s dvojitou přesností. SQL: Viz float a real. |
DateType , date |
date |
Spark: DateType představuje hodnoty obsahující hodnoty pro rok, měsíc a den bez časového pásma. SQL: Viz datum. |
TimestampType , timestamp |
datetime2 |
Spark: TimestampType představuje hodnoty tvořené hodnotami polí rok, měsíc, den, hodina, minuta a sekunda s místním časovým pásmem relace. Hodnota časového razítka představuje absolutní bod v čase. SQL: Viz datum a čas2. |
char |
char |
|
StringType , , String varchar |
Varchar(n) |
Spark: StringType představuje hodnoty řetězce znaků. VarcharType(n) je varianta StringType, která má omezení délky. Pokud vstupní řetězec překročí omezení délky, zápis dat selže. Tento typ lze použít pouze ve schématu tabulky, nikoli ve funkcích nebo operátorech. CharType(n) je varianta VarcharType(n), která je pevná délka. Čtení sloupce typu CharType(n) vždy vrátí řetězcové hodnoty délky n. Porovnání sloupců CharType(n) vrátí krátký sloupec na delší délku. SQL: Pokud je od Sparku zadaná délka, hodnota n v argumentu varchar(n) se nastaví na danou délku. Pokud se jedná o dělený sloupec, může být n maximálně 2048. Jinak bude varchar(max). Podívejte se na char a varchar. Použijte ji s kolací Latin1_General_100_BIN2_UTF8 . |
BinaryType , binary |
varbinary(n) |
SQL: Pokud je od Sparku zadaná délka, n nastaví se v argumentu Varbinary(n) na danou délku. Pokud se jedná o dělený sloupec, může být n maximálně 2048. Jinak bude varbinary(max). Viz binární a varbinární. |
array , , map struct |
varchar(max) |
SQL: Serializuje do FORMÁTU JSON s kolací Latin1_General_100_BIN2_UTF8 . Viz data JSON. |
Poznámka:
Kolace na úrovni databáze je Latin1_General_100_CI_AS_SC_UTF8
.
Model zabezpečení
Databáze a tabulky Sparku a jejich synchronizované reprezentace v modulu SQL budou zabezpečeny na základní úrovni úložiště. Vzhledem k tomu, že v současné době nemají oprávnění k samotným objektům, je možné je zobrazit v Průzkumníku objektů.
Objekt zabezpečení, který vytvoří spravovanou tabulku, se považuje za vlastníka tabulky a má všechna práva k tabulce i k základním složkám a souborům. Vlastník databáze se navíc automaticky stane spoluvlastníkem tabulky.
Pokud vytvoříte externí tabulku Sparku nebo SQL s předávacím ověřováním, zabezpečení dat probíhá pouze na úrovni složek a souborů. Pokud někdo odešle dotaz na tento typ externí tabulky, identita zabezpečení odesílatele dotazu se předá do systému souborů, který zkontroluje přístupová práva.
Další informace o tom, jak nastavit oprávnění ke složkám a souborům, najdete ve sdílené databázi Azure Synapse Analytics.
Příklady
Vytvoření spravované tabulky ve Sparku a dotazování z bezserverového fondu SQL
V tomto scénáři máte databázi Spark s názvem mytestdb
. Viz Vytvoření a připojení k databázi Sparku s bezserverovým fondem SQL.
Spuštěním následujícího příkazu vytvořte spravovanou tabulku Sparku se SparkSQL:
CREATE TABLE mytestdb.myparquettable(id int, name string, birthdate date) USING Parquet
Tento příkaz vytvoří tabulku myparquettable
v databázi mytestdb
. Názvy tabulek budou převedeny na malá písmena. Po krátké prodlevě uvidíte tabulku v bezserverovém fondu SQL. Například z bezserverového fondu SQL spusťte následující příkaz.
USE mytestdb;
SELECT * FROM sys.tables;
Ověřte, že myparquettable
je součástí výsledků.
Poznámka:
Tabulka, která nepoužívá Delta, Parquet nebo CSV, protože se nebude synchronizovat její formát úložiště.
Dále vložte některé hodnoty do tabulky ze Sparku, například s následujícími příkazy C# Spark v poznámkovém bloku C#:
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");
Teď můžete číst data z bezserverového fondu SQL následujícím způsobem:
SELECT * FROM mytestdb.myparquettable WHERE name = 'Alice';
Výsledkem by měl být následující řádek:
id | name | birthdate
---+-------+-----------
1 | Alice | 2010-01-01
Vytvoření externí tabulky ve Sparku a dotazování z bezserverového fondu SQL
V tomto příkladu vytvoříme externí tabulku Sparku přes datové soubory Parquet vytvořené v předchozím příkladu pro spravovanou tabulku.
Například se spuštěním SparkSQL:
CREATE TABLE mytestdb.myexternalparquettable
USING Parquet
LOCATION "abfss://<storage-name>.dfs.core.windows.net/<fs>/synapse/workspaces/<synapse_ws>/warehouse/mytestdb.db/myparquettable/"
Zástupný symbol <storage-name>
nahraďte názvem účtu úložiště ADLS Gen2, který používáte, názvem systému souborů, který používáte, <fs>
a zástupným symbolem <synapse_ws>
názvem pracovního prostoru Azure Synapse, který používáte ke spuštění tohoto příkladu.
Předchozí příklad vytvoří tabulku myextneralparquettable
v databázi mytestdb
. Po krátké prodlevě uvidíte tabulku v bezserverovém fondu SQL. Například z bezserverového fondu SQL spusťte následující příkaz.
USE mytestdb;
SELECT * FROM sys.tables;
Ověřte, že myexternalparquettable
je součástí výsledků.
Teď můžete číst data z bezserverového fondu SQL následujícím způsobem:
SELECT * FROM mytestdb.dbo.myexternalparquettable WHERE name = 'Alice';
Výsledkem by měl být následující řádek:
id | name | birthdate
---+-------+-----------
1 | Alice | 2010-01-01