Sdílet prostřednictvím


Tabulky sdílených metadat služby Azure Synapse Analytics

Azure Synapse Analytics umožňuje různým výpočetním modulům pracovních prostorů sdílet databáze a tabulky mezi fondy Apache Sparku a bezserverovým fondem SQL.

Jakmile úlohu Sparku vytvoří databázi, můžete v ní vytvářet tabulky pomocí Sparku, které jako formát úložiště používají Parquet, Delta nebo CSV. Názvy tabulek budou převedeny na malá písmena a je potřeba je dotazovat pomocí názvu malého písmena. Tyto tabulky budou okamžitě dostupné pro dotazování libovolným fondem Sparku Azure Synapse pracovního prostoru. Můžete je 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 Sparku v SQL poskytuje další podrobnosti o synchronizaci tabulek.

Vzhledem k tomu, že se tabulky synchronizují s bezserverovým fondem SQL asynchronně, dojde k malému zpoždění, než se zobrazí.

Správa tabulky vytvořené Sparkem

Pomocí Sparku můžete spravovat databáze vytvořené Sparkem. 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 Sparku v SQL

Sdílené tabulky Sparku

Spark poskytuje dva typy tabulek, které Azure Synapse automaticky zveřejňuje v SQL:

  • Spravované tabulky

    Spark nabízí mnoho možností, jak ukládat data ve spravovaných tabulkách, jako jsou TEXT, CSV, JSON, JDBC, PARQUET, ORC, HIVE, DELTA a LIBSVM. Tyto soubory se obvykle ukládají v adresáři warehouse , kde jsou uložená data spravovaných tabulek.

  • Externí tabulky

    Spark také nabízí způsoby, jak vytvořit externí tabulky nad existujícími daty, a to buď poskytnutím LOCATION možnosti, nebo pomocí 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í pouze spravované a externí tabulky Sparku, které ukládají data ve formátu Parquet, DELTA nebo CSV s moduly SQL. Tabulky zálohované v jiných formátech se automaticky nesynchronizují. Tyto tabulky možná budete moct synchronizovat explicitně sami jako externí tabulku ve vlastní databázi SQL, pokud modul SQL podporuje podkladový formát tabulky.

Poznámka

V současné době se v bezserverovém fondu SQL plně podporují jenom formáty Parquet a CSV. Tabulky Spark Delta jsou k dispozici také 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, které se dají sdílet, se v modulu SQL zobrazují jako externí tabulky s následujícími vlastnostmi:

  • Zdroj dat externí tabulky SQL je zdroj dat představující složku umístění tabulky Sparku.
  • 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, použijí se názvy tabulek Spark a sloupců pro externí tabulku SQL.

Tabulky Sparku poskytují jiné datové typy než moduly Synapse SQL. Následující tabulka mapuje mapování datových typů tabulek Spark na typy SQL:

Datový typ Sparku Datový typ SQL Komentáře
LongType, long, bigint bigint Spark: LongType představuje 8 bajtová celočíselná čísla se signedýmm čísly.
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í podepsaná desetinná čísla. Podporováno interně pomocí java.math.BigDecimal. BigDecimal se skládá z hodnoty libovolné přesnosti celé číslo bez měřítka a 32bitového celočíselného měřítka.
SQL: Pevná čísla přesnosti a měřítka. Při použití maximální přesnosti jsou platné hodnoty od - 10^38 +1 do 10^38 - 1. Synonyma ISO pro desetinné číslo jsou dec a dec(p, s). Funkce numeric je funkčně shodná s desítkovým číslem. Viz desetinná a číselná čísla.
IntegerType, Integer, int int SparkIntegerType představuje 4 bajtová celočíselná čísla se signedýmm systémem.
SQL: Viz int, bigint, smallint a tinyint.
ByteType, Byte, tinyint smallint Spark: ByteType představuje 1 bajtová celočíselná čísla se signedýmm čísly [-128 až 127] a ShortType představuje 2 bajtová celočíselná čísla se signedýmýmm kódem [-32768 až 32767].
SQL: Tinyint představuje 1 bajtová celá čísla [0, 255] a smallint představuje 2 bajtová celočíselná čísla se signedýmm kódem [-32768, 32767]. Viz int, bigint, smallint a tinyint.
ShortType, Short, smallint smallint Platí to samé jako výše.
DoubleType, Double float Spark: DoubleType představuje 8babajtů čísla s plovoucí desetinou čárkou s dvojitou přesností. SQL: Viz float a real.
FloatType, float, real real Spark: FloatType představuje čísla s plovoucí desetinou čárkou o 4 bajtové přesnosti s plovoucí desetinou čárkou. SQL: Viz float a real.
DateType, date date Spark: DateType představuje hodnoty obsahující hodnoty polí rok, měsíc a den bez časového pásma.
SQL: Viz datum.
TimestampType, timestamp datetime2 Spark: TimestampType představuje hodnoty obsahující hodnoty polí rok, měsíc, den, hodinu, minutu a sekundu s místním časovým pásmem relace. Hodnota časového razítka představuje absolutní bod v čase.
SQL: Viz datetime2.
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. Zápis dat selže, pokud vstupní řetězec překročí omezení délky. Tento typ lze použít pouze ve schématu tabulky, nikoli ve funkcích/operátorech.
CharType(n) je varianta VarcharType(n), která má pevnou délku. Čtení sloupce typu CharType(n) vždy vrátí řetězcové hodnoty o délce n. Porovnání sloupců CharType(n) převede krátký sloupec na delší délku.
SQL: Pokud spark poskytuje délku, n v varchar(n) se nastaví na danou délku. Pokud se jedná o dělený sloupec, n může být maximálně 2048. V opačném případě bude varchar(max). Viz char a varchar.
Použijte ho s kolací Latin1_General_100_BIN2_UTF8.
BinaryType, binary varbinary(n) SQL: Pokud Spark poskytuje délku, n bude ve Varbinary(n) nastavená na danou délku. Pokud se jedná o dělený sloupec, n může být maximálně 2048. V opačném případě to bude Varbinary(max). Viz binární a varbinární.
array, map, struct varchar(max) SQL: Serializuje se do FORMÁTU JSON pomocí kolace 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čené na úrovni základního úložiště. Vzhledem k tomu, že aktuálně nemají oprávnění k samotným objektům, mohou být objekty zobrazeny 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 nastavení oprávnění ke složkám a souborům najdete v tématu sdílená databáze 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í databáze Spark 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. Spusťte například následující příkaz z bezserverového fondu SQL.

    USE mytestdb;
    SELECT * FROM sys.tables;

Ověřte, že myparquettable je součástí výsledků.

Poznámka

Tabulka, která jako formát úložiště nepoužívá Delta, Parquet nebo CSV, se nebude synchronizovat.

Dále do tabulky ze Sparku vložte nějaké hodnoty, například s následujícími příkazy Jazyka C# Spark v poznámkovém bloku jazyka 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.dbo.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 sparkSQL spusťte:

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ý text <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 k tomuto 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. Spusťte například následující příkaz z bezserverového fondu SQL.

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

Další kroky