Azure Synapse Analytics 共用中繼資料資料表

Azure Synapse Analytics 允許不同的工作區計算引擎,共用 Apache Spark 集區與無伺服器 SQL 集區間的資料庫和資料表。

Spark 作業建立資料庫後,您可以透過 Spark,使用 Parquet、Delta 或 CSV 作為儲存格式建立資料表。 資料表名稱會轉換為小寫,所以要使用小寫名稱查詢。 這些資料表隨即可供任何 Azure Synapse 工作區 Spark 集區查詢。 若具有適當權限,您也可以從任何 Spark 作業中使用這些資料表。

Spark 所建立和管理的資料表以及外部資料表也會在無伺服器 SQL 集區的對應同步資料庫中,以同名的外部資料表形式來提供使用。 在 SQL 中公開 Spark 資料表會提供資料表同步的更多詳細資料。

資料表不會即時同步至無伺服器 SQL 集區,因此資料表會延遲顯示。

管理 Spark 建立的資料表

使用 Spark 來管理 Spark 建立的資料庫。 例如,透過無伺服器 Apache Spark 集區作業來刪除資料庫,以及從 Spark 建立其中的資料表。

同步資料庫中的物件無法透過無伺服器 SQL 集區修改。

在 SQL 中公開 Spark 資料表

共用的 Spark 資料表

Spark 提供兩種可讓 Azure Synapse 自動在 SQL 中公開的資料類型:

  • 受控資料表

    Spark 提供許多將資料儲存在受控資料表中的選項,例如 TEXT、CSV、JSON、JDBC、PARQUET、ORC、HIVE、DELTA 和 LIBSVM。 這些檔案通常會儲存在 warehouse 目錄,該目錄也是儲存受控資料表資料的地方。

  • 外部資料表

    Spark 也可讓您藉由提供 LOCATION 選項或使用 Hive 格式,以現有資料建立外部資料表。 這類外部資料表可以使用各種不同的資料格式,包括 Parquet。

Azure Synapse 目前只共用受控與外部 Spark 資料表,而這些資料表使用 SQL 引擎以 Parquet、DELTA 或 CSV 格式儲存資料。 以其他格式支援的資料表不會自動進行同步。 如果 SQL 引擎支援資料表的基礎格式,您可以自行將這類資料表明確地同步為您自己 SQL 資料庫中的外部資料表。

注意

目前無伺服器 SQL 集區中只有 Parquet 和 CSV 格式會獲得完整支援。 Spark Delta 資料表也可以在無伺服器 SQL 集區中使用,但這項功能是公開預覽版本。 在 Spark 中建立的外部資料表無法在專用 SQL 集區資料庫中使用。

共用 Spark 資料表

在 SQL 引擎中以外部資料表形式公開的可共用受控資料表和外部 Spark 資料表,具有下列屬性:

  • SQL 外部資料表的資料來源是代表 Spark 資料表所在資料夾的資料來源。
  • SQL 外部資料表的檔案格式是 Parquet、Delta 或 CSV。
  • SQL 外部資料表的存取認證是傳遞式認證。

由於所有 Spark 資料表名稱都是有效的 SQL 資料表名稱,而且所有 Spark 資料行名稱都是有效的 SQL 資料行名稱,因此 SQL 外部資料表會使用 Spark 資料表和資料行的名稱。

Spark 資料表提供的資料類型與 Synapse SQL 引擎不同。 下表是 Spark 資料表的資料類型與 SQL 類型的對應:

Spark 資料類型 SQL 資料類型 註解
LongTypelongbigint bigint SparkLongType 代表 8 位元組帶正負號的整數。
SQL:請參閱 int、bigint、smallint 和 tinyint
BooleanType, boolean bit (Parquet)、varchar(6) (CSV) Spark:布林值。
SQL:請參閱 [/sql/t-sql/data-types/bit-transact-sql)。
DecimalType, decimal, dec, numeric decimal SparkDecimalType 代表任意精確度帶正負號的十進位數字。 java.math.BigDecimal 的內部備份。 BigDecimal 是由任意精確度的整數無比例值與 32 位元整數比例值組成。
SQL:固定精確度與比例數值。 當使用最大有效位數時,有效的值是從 - 10^38 +1 到 10^38 - 1。 decimal 的 ISO 同義字為 dec 及 dec(p, s) 。 numeric 在功能上與 decimal 相同。 請參閱十進位與數值
IntegerTypeIntegerint int SparkIntegerType 代表 4 位元組帶正負號的整數。
SQL:請參閱 int、bigint、smallint 和 tinyint
ByteTypeBytetinyint smallint SparkByteType 代表 1 位元組帶正負號的整數 [-128 至 127],而 ShortType 代表 2 位元組帶正負號的整數 [-32768 至 32767]。
SQL:Tinyint 代表 1 位元組帶正負號的整數 [0、255],而 Smallint 代表 2 位元組帶正負號的整數 [-32768、32767]。 請參閱 int、bigint、smallint 和 tinyint
ShortTypeShortsmallint smallint 同上。
DoubleType, Double float SparkDoubleType 代表 8 位元組雙精確度浮點數。 SQL:請參閱浮點數與實數
FloatTypefloatreal real SparkFloatType 代表 4 位元組雙精確度浮點數。 SQL:請參閱浮點數與實數
DateType, date date SparkDateType 代表包含年月日,但不含時區的欄位值構成的值。
SQL:請參閱日期
TimestampType, timestamp datetime2 SparkTimestampType 代表年月日時分秒的欄位值構成的值,並包含工作階段區域時區。 時間戳記值代表絕對的時間點。
SQL:請參閱日期時間 2
char char
StringTypeStringvarchar Varchar(n) SparkStringType 代表字元字串值。 VarcharType(n) 是 StringType 的變數,並有長度限制。 如果輸入字串超過長度限制,資料寫入就會失敗。 此類型只能用於資料表結構描述,而不能用於函式/運算子。
CharType(n)VarcharType(n) 長度固定的變數。 讀取 CharType(n) 類型的資料行一律會傳回長度 n 的字串值。 CharType(n) 資料行比較會以較短的值填補至較長的值。
SQL:如果 Spark 提供長度,varchar(n) 的 n 會設為該長度。 如果值是分割資料行,則 n 的最大值可為 2048。 如果不是,n 則為 varchar(最大值)。 請參閱 char 和 varchar
搭配定序使用 Latin1_General_100_BIN2_UTF8
BinaryType, binary varbinary(n) SQL:如果 Spark 提供長度,nVarbinary(n) 中的值會設為該長度。 如果值是分割資料行,則 n 的最大值可為 2048。 如果不是,n 則為 Varbinary(最大值)。 請參閱 binary 和 varbinary
arraymapstruct varchar(max) SQL: 使用定序讓 JSON 序列化Latin1_General_100_BIN2_UTF8。 請參閱 JSON 資料

注意

資料庫層級定序是 Latin1_General_100_CI_AS_SC_UTF8

安全性模型

Spark 資料庫和資料表,以及其在 SQL 引擎中的同步代表項目,將會在基礎儲存層級受到保護。 因為其本身目前沒有物件的權限,所以物件會在物件總管中顯示。

建立受控資料表的安全性主體會被視為該資料表的擁有者,並具有該資料表的所有權限,包括基礎資料夾和檔案。 此外,資料庫的擁有者會自動成為資料表的共同擁有者。

如果您使用驗證傳遞來建立 Spark 或 SQL 外部資料表,資料只會在資料夾和檔案層級上受到保護。 如果有人查詢此類型的外部資料表,查詢提交者的安全性識別會向下傳遞至檔案系統,以檢查存取權限。

如需有關如何設定資料夾和檔案權限的詳細資訊,請參閱 共用資料庫

範例

在 Spark 中建立受控資料表,並透過無伺服器 SQL 集區查詢

在此案例中,您有一個名為 mytestdb 的 Spark 資料庫。 請參閱使用無伺服器 SQL 集區建立並連線到 Spark 資料庫

藉由執行下列命令,您可以使用 SparkSQL 建立受控 Spark 資料表:

    CREATE TABLE mytestdb.myparquettable(id int, name string, birthdate date) USING Parquet

此命令會在 mytestdb 資料庫中建立 myparquettable 資料表。 資料表名稱會轉換為小寫。 短暫延遲之後,您就可以在無伺服器 SQL 集區中看到資料表。 例如,從無伺服器 SQL 集區執行下列陳述式。

    USE mytestdb;
    SELECT * FROM sys.tables;

確認結果中包含 myparquettable

注意

不使用 Parquet、Delta 或 CSV 作為儲存格式的資料表,即不會同步。

接下來,將一些值從 Spark 插入資料表中,例如,在 C# 筆記本中使用下列 C# Spark 陳述式:

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");

現在您可以從無伺服器 SQL 集區讀取資料,如下所示:

SELECT * FROM mytestdb.dbo.myparquettable WHERE name = 'Alice';

您應該會取得具有下列資料列的結果:

id | name | birthdate
---+-------+-----------
1 | Alice | 2010-01-01

在 Spark 中建立外部資料表,並透過無伺服器 SQL 集區查詢

在此範例中,建立外部 Spark 資料表時,我們會使用之前為受控資料表建立的 Parquet 資料檔案。

例如,使用 SparkSQL 執行:

CREATE TABLE mytestdb.myexternalparquettable
    USING Parquet
    LOCATION "abfss://<storage-name>.dfs.core.windows.net/<fs>/synapse/workspaces/<synapse_ws>/warehouse/mytestdb.db/myparquettable/"

<storage-name> 目前使用的 ADLS Gen2 儲存體帳戶名稱、<fs>檔案系統名稱,及<synapse_ws>您執行此範例的 Azure Synapse Analytics 工作區名稱的預留位置,取代此預留位置。

前一個範例會在 mytestdb 資料庫中建立 myextneralparquettable 資料表。 短暫延遲之後,您就可以在無伺服器 SQL 集區中看到資料表。 例如,從無伺服器 SQL 集區執行下列陳述式。

USE mytestdb;
SELECT * FROM sys.tables;

確認結果中包含 myexternalparquettable

現在您可以從無伺服器 SQL 集區讀取資料,如下所示:

SELECT * FROM mytestdb.dbo.myexternalparquettable WHERE name = 'Alice';

您應該會取得具有下列資料列的結果:

id | name | birthdate
---+-------+-----------
1 | Alice | 2010-01-01

下一步