Tabel metadata berbagi Azure Synapse Analytics

Azure Synapse Analytics memungkinkan berbagai mesin komputasi ruang kerja berbagi database dan tabel antara kumpulan Apache Spark dan kumpulan SQL tanpa server.

Setelah database dibuat oleh pekerjaan Spark, Anda dapat membuat tabel di dalamnya dengan Spark yang menggunakan Parquet, Delta atau CSV sebagai format penyimpanan. Nama tabel akan dikonversi menjadi huruf kecil dan perlu dikueri menggunakan nama huruf kecil. Tabel ini akan segera tersedia untuk dikueri oleh salah satu kumpulan Spark ruang kerja Azure Synapse. Tabel tersebut juga dapat digunakan dari salah satu pekerjaan Spark yang patuh pada izin.

Tabel Spark yang dibuat, dikelola, dan eksternal juga tersedia sebagai tabel eksternal dengan nama yang sama dalam database tersinkron terkait di kumpulan SQL tanpa server. Mengekspos tabel Spark di SQL memberikan detail selengkapnya tentang sinkronisasi tabel.

Karena tabel disinkronkan ke kumpulan SQL tanpa server secara asinkron, akan ada sedikit penundaan hingga tabel muncul.

Mengelola tabel yang dibuat Spark

Gunakan Spark untuk mengelola database yang dibuat Spark. Misalnya, hapus melalui pekerjaan kumpulan Apache Spark tanpa server, dan buat tabel di dalamnya dari Spark.

Objek dalam database yang disinkronkan tidak dapat diubah dari kumpulan SQL tanpa server.

Mengekspos tabel Spark di SQL

Tabel Spark berbagi

Spark menyediakan dua jenis tabel yang diekspos Azure Synapse di SQL secara otomatis:

  • Tabel terkelola

    Spark menyediakan banyak opsi cara menyimpan data dalam tabel terkelola, seperti TEXT, CSV, JSON, JDBC, PARQUET, ORC, HIVE, DELTA, dan LIBSVM. File-file ini biasanya disimpan dalam direktori warehouse tempat data tabel terkelola disimpan.

  • Tabel eksternal

    Spark juga menyediakan cara untuk membuat tabel eksternal di atas data yang ada, baik dengan menyediakan opsi LOCATION atau menggunakan format Apache Hive. Tabel eksternal tersebut dapat terdiri dari berbagai format data, termasuk Parquet.

Azure Synapse saat ini hanya berbagi tabel Spark terkelola dan eksternal yang menyimpan data dalam format Parquet, DELTA atau CSV dengan mesin SQL. Tabel yang didukung oleh format lain tidak disinkronkan secara otomatis. Anda mungkin dapat menyinkronkan tabel tersebut secara eksplisit sebagai tabel eksternal dalam database SQL Anda sendiri jika mesin SQL mendukung format tabel yang mendasarinya.

Catatan

Saat ini, hanya format Parquet dan CSV yang disinkronkan ke kumpulan SQL tanpa server. Tabel Spark Delta juga tersedia di kumpulan SQL tanpa server, tetapi fitur ini ada di pratinjau umum. Tabel eksternal yang dibuat di Spark tidak tersedia dalam database kumpulan SQL khusus.

Tabel berbagi Spark

Tabel Spark terkelola dan eksternal yang dapat dibagikan diekspos di mesin SQL sebagai tabel eksternal dengan properti berikut:

  • Sumber data tabel eksternal SQL adalah sumber data yang mewakili folder lokasi tabel Spark.
  • Format file tabel eksternal SQL adalah Parquet, Delta atau CSV.
  • Informasi masuk akses tabel eksternal SQL adalah pass-through.

Karena semua nama tabel Spark adalah nama tabel SQL yang valid dan semua nama kolom Spark adalah nama kolom SQL yang valid, nama tabel dan kolom Spark akan digunakan untuk tabel eksternal SQL.

Tabel Spark menyediakan jenis data yang berbeda dari mesin Synapse SQL. Peta tabel berikut Ini memetakan jenis data tabel Spark ke jenis SQL:

Jenis data Spark Jenis data SQL Komentar
LongType, long, bigint bigint Spark: LongType mewakili angka bilangan bulat bertanda dengan ukuran 8 byte.
SQL: Lihat int, bigint, smallint, and tinyint.
BooleanType, boolean bit (Parquet), varchar(6) (CSV) Spark: Boolean.
SQL: Lihat [/sql/t-sql/data-types/bit-transact-sql).
DecimalType, decimal, dec, numeric decimal Spark:DecimalType mewakili angka desimal bertanda dengan presisi acak. Didukung secara internal oleh java.math.BigDecimal. BigDecimal terdiri dari nilai bilangan bulat presisi acak yang tidak diskalakan dan skala bilangan bulat 32 bit.
SQL: Presisi tetap dan angka skala. Ketika presisi maksimum digunakan, nilai yang valid meliputi - 10^38 +1 hingga 10^38 - 1. Sinonim ISO untuk desimal adalah dec dan dec(p, s). numerik secara fungsional identik dengan desimal. Lihat desimal dan numerik.
IntegerType, Integer, int int SparkIntegerType mewakili angka bilangan bulat bertanda 4 byte.
SQL: Lihat int, bigint, smallint, dan tinyint.
ByteType, Byte, tinyint smallint Spark: ByteType mewakili angka bilangan bulat bertanda dengan ukuran 1 byte [-128 hingga 127] dan ShortType mewakili angka bilangan bulat bertanda dengan ukuran 2 byte [-32768 hingga 32767].
Spark: Tinyint mewakili angka bilangan bulat bertanda dengan ukuran 1 byte [0, 255] dan smallint mewakili angka bilangan bulat bertanda dengan ukuran 2 byte [-32768, 32767]. Lihat int, bigint, smallint, dan tinyint.
ShortType, Short, smallint smallint Sama dengan atas.
DoubleType, Double float Spark: DoubleType mewakili angka titik mengambang presisi ganda berukuran 8 byte. SQL: Lihat float dan nyata.
FloatType, float, real real Spark: FloatType mewakili angka titik mengambang presisi ganda berukuran 4 byte. SQL: Lihat float dan nyata.
DateType, date date Spark: DateType mewakili nilai yang terdiri dari berbagai nilai kolom tahun, bulan, dan hari, tanpa zona waktu.
SQL: Lihat tanggal.
TimestampType, timestamp datetime2 Spark: TimestampType mewakili nilai yang terdiri dari berbagai nilai kolom tahun, bulan, hari, jam, menit, dan detik, dengan zona waktu lokal sesi. Nilai tanda waktu mewakili titik waktu absolut.
SQL: Lihat datetime2.
char char
StringType, String, varchar Varchar(n) Spark: StringType mewakili nilai string karakter. VarcharType(n) adalah varian dari StringType yang memiliki batasan panjang. Penulisan data akan gagal jika string input melebihi batasan panjang. Jenis ini hanya dapat digunakan dalam skema tabel, bukan fungsi/operator.
CharType(n) adalah varian dari VarcharType(n) yang panjangnya tetap. Kolom baca jenis CharType(n) selalu menampilkan nilai string dengan panjang n. Perbandingan kolom CharType(n) akan menambahkan kolom yang pendek ke kolom yang lebih panjang.
SQL: Jika terdapat panjang yang disediakan dari Spark, n dalam varchar(n) akan diatur ke panjang tersebut. Jika berupa kolom yang dipartisi, maksimal n dapat mencapai 2048. Jika tidak, panjangnya akan menjadi varchar(maks) . Lihat char dan varchar.
Gunakan dengan kolase Latin1_General_100_BIN2_UTF8.
BinaryType, binary varbinary(n) SQL: Jika terdapat panjang yang disediakan dari, n dalam varchar(n) akan diatur ke panjang tersebut. Jika berupa kolom yang dipartisi, maksimal n dapat mencapai 2048. Jika tidak, panjangnya akan menjadi Varbinary(maks) . Lihat biner dan varbinary.
array, map, struct varchar(max) SQL: Menserialkan ke JSON dengan kolase Latin1_General_100_BIN2_UTF8. Lihat Data JSON.

Catatan

Kolase tingkat database adalah Latin1_General_100_CI_AS_SC_UTF8.

Model keamanan

Database dan tabel Spark, bersama dengan representasinya yang disinkronkan di mesin SQL akan diamankan pada tingkat penyimpanan yang mendasarinya. Karena saat ini tabel dan database tersebut tidak memiliki izin pada objek itu sendiri, objek dapat dilihat di penjelajah objek.

Keamanan utama yang membuat tabel terkelola akan dianggap sebagai pemilik tabel tersebut dan memiliki semua hak atas tabel serta folder dan file yang mendasarinya. Selain itu, pemilik database akan menjadi pemilik bersama tabel secara otomatis.

Jika Anda membuat tabel eksternal Spark atau SQL dengan autentikasi pass-through, data hanya diamankan di tingkat folder dan file. Jika seseorang meminta jenis tabel eksternal ini, identitas keamanan pengirim kueri diwariskan ke sistem file, yang akan memeriksa hak akses.

Untuk mengetahui informasi selengkapnya tentang cara mengatur izin pada folder dan file, lihat database berbagi Azure Synapse Analytics.

Contoh

Membuat tabel terkelola yang di Spark dan kueri dari kumpulan SQL tanpa server

Dalam skenario ini, Anda memiliki database Spark bernama mytestdb. Lihat Membuat dan menyambungkan ke database Spark dengan kumpulan SQL tanpa server.

Buat tabel Spark terkelola dengan SparkSQL dengan menjalankan perintah berikut ini:

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

Perintah ini membuat tabel myparquettable dalam database mytestdb. Nama tabel akan dikonversi menjadi huruf kecil. Setelah penundaan singkat, Anda dapat melihat tabel di kumpulan SQL tanpa server Anda. Misalnya, jalankan pernyataan berikut dari kumpulan SQL tanpa server Anda.

    USE mytestdb;
    SELECT * FROM sys.tables;

Verifikasi apakah myparquettable disertakan dalam hasil.

Catatan

Tabel yang tidak menggunakan Parquet, Delta atau CSV sebagai format penyimpanannya tidak akan disinkronkan.

Berikutnya, sisipkan beberapa nilai ke dalam tabel dari Spark, misalnya dengan pernyataan C# Spark berikut ini di buku catatan 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");

Sekarang Anda dapat membaca data dari kumpulan SQL tanpa server Anda sebagai berikut:

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

Anda akan mendapatkan baris berikut sebagai hasilnya:

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

Membuat tabel eksternal di Spark dan kueri dari kumpulan SQL tanpa server

Dalam contoh ini, kita akan membuat tabel Spark eksternal pada file data Parquet yang dibuat pada contoh sebelumnya untuk tabel terkelola.

Misalnya, dengan SparkSQL jalankan:

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

Ganti tempat penampung <storage-name> dengan nama akun penyimpanan ADLS Gen2 yang Anda gunakan, <fs> dengan nama sistem file yang Anda gunakan, dan tempat penampung <synapse_ws> dengan nama ruang kerja Azure Synapse yang Anda gunakan untuk menjalankan contoh ini.

Contoh sebelumnya membuat tabel myextneralparquettable dalam database mytestdb. Setelah penundaan singkat, Anda dapat melihat tabel di kumpulan SQL tanpa server Anda. Misalnya, jalankan pernyataan berikut dari kumpulan SQL tanpa server Anda.

USE mytestdb;
SELECT * FROM sys.tables;

Verifikasi apakah myexternalparquettable disertakan dalam hasil.

Sekarang Anda dapat membaca data dari kumpulan SQL tanpa server Anda sebagai berikut:

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

Anda akan mendapatkan baris berikut sebagai hasilnya:

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

Langkah berikutnya