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 資料類型 | 註解 |
---|---|---|
LongType 、 、 long bigint |
bigint |
Spark:LongType 代表 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 |
Spark:DecimalType 代表任意精確度帶正負號的十進位數字。 java.math.BigDecimal 的內部備份。 BigDecimal 是由任意精確度的整數無比例值與 32 位元整數比例值組成。 SQL:固定精確度與比例數值。 當使用最大有效位數時,有效的值是從 - 10^38 +1 到 10^38 - 1。 decimal 的 ISO 同義字為 dec 及 dec(p, s) 。 numeric 在功能上與 decimal 相同。 請參閱十進位與數值。 |
IntegerType 、 、 Integer int |
int |
Spark IntegerType 代表 4 個字節帶正負號的整數。 SQL:請參閱 int、bigint、smallint 和 tinyint。 |
ByteType 、 、 Byte tinyint |
smallint |
Spark: ByteType 代表 1 個字節帶正負號的整數數位 [-128 到 127],ShortType 代表 2 個字節帶正負號的整數數位 [-32768 到 32767]。 SQL:Tinyint 代表 1 個字節帶正負號的整數數位 [0, 255] ,smallint 代表 2 個字節帶正負號的整數數位 [-32768, 32767]。 請參閱 int、bigint、smallint 和 tinyint。 |
ShortType 、 、 Short smallint |
smallint |
同上。 |
DoubleType , Double |
float |
Spark:DoubleType 代表 8 位元組雙精確度浮點數。 SQL:請參閱浮點數與實數。 |
FloatType 、 、 float real |
real |
Spark:FloatType 代表 4 位元組雙精確度浮點數。 SQL:請參閱浮點數與實數。 |
DateType , date |
date |
Spark: DateType 代表值,包含欄位年、月和日的值,不含時區。 SQL:請參閱日期。 |
TimestampType , timestamp |
datetime2 |
Spark:TimestampType 代表年月日時分秒的欄位值構成的值,並包含工作階段區域時區。 時間戳記值代表絕對的時間點。 SQL:請參閱日期時間 2。 |
char |
char |
|
StringType 、 、 String varchar |
Varchar(n) |
Spark: StringType 代表字元字串值。 VarcharType(n) 是 StringType 的變數,並有長度限制。 如果輸入字串超過長度限制,資料寫入就會失敗。 此類型只能用於資料表結構描述,而不能用於函式/運算子。 CharType(n) 是 VarcharType(n) 長度固定的變數。 讀取 CharType(n) 類型的資料行一律會傳回長度 n 的字串值。 CharType(n) 資料行比較會以較短的值填補至較長的值。 SQL:如果 Spark 提供長度,varchar(n) 的 n 會設為該長度。 如果是分割數據行,n 可以是 max 2048。 如果不是,n 則為 varchar(最大值)。 請參閱 char 和 varchar。 搭配定序使用 Latin1_General_100_BIN2_UTF8 。 |
BinaryType , binary |
varbinary(n) |
SQL:如果 Spark 提供長度,n Varbinary(n) 中的值會設為該長度。 如果是分割數據行,n 可以是 max 2048。 如果不是,n 則為 Varbinary(最大值)。 請參閱 binary 和 varbinary。 |
array 、 、 map struct |
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.myparquettable WHERE name = 'Alice';
您應該會取得具有下列資料列的結果:
id | name | birthdate
---+-------+-----------
1 | Alice | 2010-01-01
在 Spark 中建立外部資料表,並透過無伺服器 SQL 集區查詢
在此範例中,我們將透過在上一個 Managed 數據表範例中建立的 Parquet 資料檔上建立外部 Spark 資料表。
例如,使用 SparkSQL 執行:
CREATE TABLE mytestdb.myexternalparquettable
USING Parquet
LOCATION "abfss://<storage-name>.dfs.core.windows.net/<fs>/synapse/workspaces/<synapse_ws>/warehouse/mytestdb.db/myparquettable/"
將佔位元取代為您所使用的ADLS Gen2儲存器帳戶名稱、您使用的文件系統名稱,<fs>
並將佔位<storage-name>
元<synapse_ws>
取代為您用來執行此範例的 Azure Synapse 工作區名稱。
前一個範例會在 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