Sdílet prostřednictvím


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 změnit 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, budete možná moct tyto 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, , longbigint 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, , decnumeric 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, , Integerint int Spark IntegerType představuje 4 bajtová celočíselná čísla.
SQL: Viz int, bigint, smallint a tinyint.
ByteType, , Bytetinyint smallint Spark: ByteType představuje celočíselná čísla se 1 bajty [-128 až 127] a ShortType představuje 2 bajtová celočíselná čísla [-32768 až 32767].
SQL: Tinyint představuje celočíselná čísla se 1 bajty [0, 255] a smallint představuje 2 bajtová celá čísla signed integer [-32768, 32767]. Podívejte se na int, bigint, smallint a tinyint.
ShortType, , Shortsmallint 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, , floatreal 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 polí 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, , Stringvarchar 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 je rozdělený do oddílů, 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 je rozdělený do oddílů, může být n maximálně 2048. Jinak bude varbinary(max). Viz binární a varbinární.
array, , mapstruct 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časnosti 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.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 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

Další kroky