Azure Synapse Analytics paylaşılan meta veri tabloları
Azure Synapse Analytics, farklı çalışma alanı hesaplama altyapılarının Apache Spark havuzları ile sunucusuz SQL havuzu arasında veritabanlarını ve tabloları paylaşmasına olanak tanır.
Spark işi tarafından bir veritabanı oluşturulduktan sonra, Spark ile depolama biçimi olarak Parquet, Delta veya CSV kullanan tablolar oluşturabilirsiniz. Tablo adları küçük harfe dönüştürülür ve küçük harf adı kullanılarak sorgulanması gerekir. Bu tablolar, Azure Synapse çalışma alanı Spark havuzlarından herhangi biri tarafından sorgulanabilir duruma gelir. Ayrıca izinlere tabi spark işlerinin herhangi birinden de kullanılabilirler.
Oluşturulan, yönetilen ve dış tablolar, sunucusuz SQL havuzundaki karşılık gelen eşitlenmiş veritabanında aynı ada sahip dış tablolar olarak da kullanılabilir hale getirilir. SPARK tablosunu SQL'de görüntülemek, tablo eşitlemesi hakkında daha fazla ayrıntı sağlar.
Tablolar sunucusuz SQL havuzuna zaman uyumsuz olarak eşitlenmiş olduğundan, görüntülenene kadar küçük bir gecikme olacaktır.
Spark tarafından oluşturulan tabloyu yönetme
Spark tarafından oluşturulan veritabanlarını yönetmek için Spark'ı kullanın. Örneğin, sunucusuz bir Apache Spark havuz işi aracılığıyla silin ve Spark'tan tablo oluşturun.
Eşitlenmiş veritabanlarındaki nesneler sunucusuz SQL havuzundan değiştirilemez.
SQL'de Spark tablosunu kullanıma sunma
Paylaşılan Spark tabloları
Spark, Azure Synapse'in SQL'de otomatik olarak kullanıma sunduğu iki tür tablo sağlar:
Yönetilen tablolar
Spark, text, CSV, JSON, JDBC, PARQUET, ORC, HIVE, DELTA ve LIBSVM gibi yönetilen tablolarda veri depolamaya yönelik birçok seçenek sağlar. Bu dosyalar normalde yönetilen tablo verilerinin
warehouse
depolandığı dizinde depolanır.Dış tablolar
Spark, seçeneği sağlayarak
LOCATION
veya Hive biçimini kullanarak mevcut veriler üzerinde dış tablolar oluşturmanın yollarını da sağlar. Bu tür dış tablolar, Parquet de dahil olmak üzere çeşitli veri biçimlerinin üzerinde olabilir.
Azure Synapse şu anda yalnızca verilerini Parquet, DELTA veya CSV biçiminde depolayan yönetilen ve dış Spark tablolarını SQL altyapılarıyla paylaşır. Diğer biçimler tarafından yedeklenen tablolar otomatik olarak eşitlenmez. SQL altyapısı tablonun temel biçimini destekliyorsa, bu tür tabloları kendi SQL veritabanınızda bir dış tablo olarak açıkça eşitleyebilirsiniz.
Not
Şu anda sunucusuz SQL havuzunda yalnızca Parquet ve CSV biçimleri tam olarak desteklenmektedir. Spark Delta tabloları sunucusuz SQL havuzunda da kullanılabilir, ancak bu özellik genel önizleme aşamasındadır. Spark'ta oluşturulan dış tablolar ayrılmış SQL havuzu veritabanlarında kullanılamaz.
Spark tablolarını paylaşma
SQL altyapısında aşağıdaki özelliklere sahip dış tablolar olarak kullanıma sunulan paylaşılabilir yönetilen ve dış Spark tabloları:
- SQL dış tablosunun veri kaynağı, Spark tablosunun konum klasörünü temsil eden veri kaynağıdır.
- SQL dış tablosunun dosya biçimi Parquet, Delta veya CSV'dir.
- SQL dış tablosunun erişim kimlik bilgileri geçiştir.
Tüm Spark tablo adları geçerli SQL tablo adları ve tüm Spark sütun adları geçerli SQL sütun adları olduğundan, SPARK tablosu ve sütun adları SQL dış tablosu için kullanılır.
Spark tabloları Synapse SQL altyapılarından farklı veri türleri sağlar. Aşağıdaki tabloda Spark tablosu veri türleri SQL türleriyle eşlenmiştir:
Spark veri türü | SQL veri türü | Açıklamalar |
---|---|---|
LongType , long , bigint |
bigint |
Spark: LongType , 8 bayt imzalı tamsayı sayılarını temsil eder. SQL: Bkz . int, bigint, smallint ve tinyint. |
BooleanType , boolean |
bit (Parquet), varchar(6) (CSV) |
Spark: Boole. SQL: Bkz. [/sql/t-sql/data-types/bit-transact-sql). |
DecimalType , decimal , dec , numeric |
decimal |
Spark: DecimalType rastgele duyarlıklı imzalı ondalık sayıları temsil eder. java.math.BigDecimal tarafından dahili olarak yedeklendi. BigDecimal, rastgele bir duyarlık tamsayı ölçeklendirilmemiş değerden ve 32 bit tamsayı ölçeğinden oluşur. SQL: Sabit duyarlık ve ölçek sayıları. En yüksek duyarlık kullanıldığında, geçerli değerler - 10^38 +1 ile 10^38 - 1 arasında olur. Ondalık için ISO eş anlamlıları dec ve dec(p, s) şeklindedir. sayısal, işlevsel olarak ondalıkla aynıdır. Bkz. ondalık ve sayısal. |
IntegerType , Integer , int |
int |
Spark IntegerType , 4 bayt işaretli tamsayı sayılarını temsil eder. SQL: Bkz . int, bigint, smallint ve tinyint. |
ByteType , Byte , tinyint |
smallint |
Spark: ByteType 1 bayt imzalı tamsayı sayılarını [-128 - 127] ve ShortType 2 bayt imzalı tamsayı sayılarını temsil eder [-32768 - 32767]. SQL: Tinyint 1 bayt imzalı tamsayı sayılarını [0, 255] ve smallint 2 bayt işaretli tamsayı sayılarını [-32768, 32767] temsil eder. Bkz . int, bigint, smallint ve tinyint. |
ShortType , Short , smallint |
smallint |
Yukarıdakiyle aynıdır. |
DoubleType , Double |
float |
Spark: DoubleType , 8 baytlık çift duyarlıklı kayan nokta sayılarını temsil eder. SQL: Bkz . kayan ve gerçek. |
FloatType , float , real |
real |
Spark: FloatType , 4 baytlık çift duyarlıklı kayan nokta sayılarını temsil eder. SQL: Bkz . kayan ve gerçek. |
DateType , date |
date |
Spark: DateType , saat dilimi olmadan yıl, ay ve gün alanlarının değerlerini içeren değerleri temsil eder. SQL: Tarihe bakın. |
TimestampType , timestamp |
datetime2 |
Spark: TimestampType , oturum yerel saat dilimiyle yıl, ay, gün, saat, dakika ve saniye alanlarının değerlerini içeren değerleri temsil eder. Zaman damgası değeri, zaman içinde mutlak bir noktayı temsil eder. SQL: Bkz . datetime2. |
char |
char |
|
StringType , String , varchar |
Varchar(n) |
Spark: StringType , karakter dizesi değerlerini temsil eder. VarcharType(n), uzunluk sınırlaması olan bir StringType değişkenidir. Giriş dizesi uzunluk sınırlamasını aşarsa veri yazma işlemi başarısız olur. Bu tür yalnızca tablo şemasında kullanılabilir, işlevlerde/işleçlerde kullanılamaz. CharType(n), sabit uzunlukta bir VarcharType(n) değişkenidir. CharType(n) türünde okuma sütunu her zaman n uzunluğunda dize değerleri döndürür. CharType(n) sütun karşılaştırması, kısa olanı uzun uzunluğa ekler. SQL: Spark'tan sağlanan bir uzunluk varsa, varchar(n) cinsinden n bu uzunluğa ayarlanır. Bölümlenmiş sütun ise, n en fazla 2048 olabilir. Aksi takdirde, varchar(max) olur. Bkz . char ve varchar. Harmanlama Latin1_General_100_BIN2_UTF8 ile kullanın. |
BinaryType , binary |
varbinary(n) |
SQL: Spark'tan sağlanan bir uzunluk varsa, n Varbinary(n) içinde bu uzunluğa ayarlanır. Bölümlenmiş sütun ise, n en fazla 2048 olabilir. Aksi takdirde, Varbinary (max) olur. Bkz. ikili ve varbinary. |
array , map , struct |
varchar(max) |
SQL: Harmanlama ile JSON olarak seri hale getirmektedir Latin1_General_100_BIN2_UTF8 . Bkz. JSON Verileri. |
Not
Veritabanı düzeyinde harmanlama şeklindedir Latin1_General_100_CI_AS_SC_UTF8
.
Güvenlik modeli
Spark veritabanları ve tabloların yanı sıra SQL altyapısındaki eşitlenmiş gösterimleri temel depolama düzeyinde güvenli hale getirilecektir. Şu anda nesneler üzerinde izinleri olmadığından, nesneler nesne gezgininde görülebilir.
Yönetilen tabloyu oluşturan güvenlik sorumlusu o tablonun sahibi kabul edilir ve hem o tablo hem de temel klasörler ve dosyalar üzerinde tüm haklara sahip olur. Buna ek olarak, veritabanının sahibi otomatik olarak tablonun ikincil sahibi olur.
Kimlik doğrulaması geçişiyle bir Spark veya SQL dış tablosu oluşturursanız, veriler yalnızca klasör ve dosya düzeylerinde güvenlik altına alır. Birisi bu tür bir dış tabloyu sorgularsa, sorguyu gönderenin güvenlik kimliği dosya sistemine geçirilir ve orada erişim hakları denetlenir.
Klasörler ve dosyalar üzerinde izinleri ayarlama hakkında daha fazla bilgi için bkz . Azure Synapse Analytics paylaşılan veritabanı.
Örnekler
Spark'ta yönetilen tablo oluşturma ve sunucusuz SQL havuzundan sorgulama
Bu senaryoda adlı mytestdb
bir Spark veritabanınız vardır. Bkz. Sunucusuz SQL havuzuyla Spark veritabanı oluşturma ve veritabanına bağlanma.
Aşağıdaki komutu çalıştırarak SparkSQL ile yönetilen bir Spark tablosu oluşturun:
CREATE TABLE mytestdb.myparquettable(id int, name string, birthdate date) USING Parquet
Bu komut veritabanında tabloyu myparquettable
mytestdb
oluşturur. Tablo adları küçük harfe dönüştürülür. Kısa bir gecikmeden sonra, tabloyu sunucusuz SQL havuzunuzda görebilirsiniz. Örneğin sunucusuz SQL havuzunuzdan aşağıdaki deyimi çalıştırın.
USE mytestdb;
SELECT * FROM sys.tables;
Sonuçlara dahil olduğunu myparquettable
doğrulayın.
Not
Depolama biçimi olarak Delta, Parquet veya CSV kullanmayan bir tablo eşitlenmez.
Ardından Spark'tan tabloya bazı değerler ekleyin; örneğin, C# not defterindeki aşağıdaki C# Spark deyimleriyle:
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");
Artık sunucusuz SQL havuzunuzdaki verileri aşağıdaki gibi okuyabilirsiniz:
SELECT * FROM mytestdb.dbo.myparquettable WHERE name = 'Alice';
Sonuç olarak aşağıdaki satırı almanız gerekir:
id | name | birthdate
---+-------+-----------
1 | Alice | 2010-01-01
Spark'ta dış tablo oluşturma ve sunucusuz SQL havuzundan sorgulama
Bu örnekte, yönetilen tablo için önceki örnekte oluşturulan Parquet veri dosyalarının üzerinde bir dış Spark tablosu oluşturacağız.
Örneğin, SparkSQL ile şunu çalıştırın:
CREATE TABLE mytestdb.myexternalparquettable
USING Parquet
LOCATION "abfss://<storage-name>.dfs.core.windows.net/<fs>/synapse/workspaces/<synapse_ws>/warehouse/mytestdb.db/myparquettable/"
Yer tutucusunu <storage-name>
kullandığınız ADLS 2. Nesil depolama hesabı adıyla, <fs>
kullandığınız dosya sistemi adıyla ve yer tutucusunu <synapse_ws>
da bu örneği çalıştırmak için kullandığınız Azure Synapse çalışma alanının adıyla değiştirin.
Önceki örnek, veritabanında mytestdb
tabloyu myextneralparquettable
oluşturur. Kısa bir gecikmeden sonra, tabloyu sunucusuz SQL havuzunuzda görebilirsiniz. Örneğin sunucusuz SQL havuzunuzdan aşağıdaki deyimi çalıştırın.
USE mytestdb;
SELECT * FROM sys.tables;
Sonuçlara dahil olduğunu myexternalparquettable
doğrulayın.
Artık sunucusuz SQL havuzunuzdaki verileri aşağıdaki gibi okuyabilirsiniz:
SELECT * FROM mytestdb.dbo.myexternalparquettable WHERE name = 'Alice';
Sonuç olarak aşağıdaki satırı almanız gerekir:
id | name | birthdate
---+-------+-----------
1 | Alice | 2010-01-01