Membuat tampilan
Artikel ini menunjukkan cara membuat tampilan di Katalog Kesatuan.
Tampilan adalah objek baca-saja yang terdiri dari satu atau lebih tabel dan tampilan di metastore. Tabel berada di lapisan ketiga namespace tiga tingkat Unity Catalog. Tampilan dapat disusun dari tabel serta tampilan lainnya dalam beberapa skema atau katalog.
Tampilan dinamis dapat digunakan untuk menyediakan kontrol akses tingkat baris dan kolom, selain masking data.
Contoh sintaksis untuk membuat tampilan:
CREATE VIEW main.default.experienced_employee
(id COMMENT 'Unique identification number', Name)
COMMENT 'View for experienced employees'
AS SELECT id, name
FROM all_employee
WHERE working_years > 5;
Catatan
Tampilan mungkin memiliki semantik eksekusi yang berbeda jika didukung oleh sumber data selain tabel Delta. Databricks merekomendasikan agar Anda selalu menentukan tampilan dengan mereferensikan sumber data menggunakan tabel atau nama tampilan. Menentukan tampilan terhadap himpunan data dengan menentukan jalur atau URI dapat menyebabkan persyaratan tata kelola data yang membingungkan.
Persyaratan
Untuk membuat tampilan:
- Anda harus memiliki izin
USE CATALOG
pada katalog induk dan izinUSE SCHEMA
danCREATE TABLE
pada skema induk. Admin metastore atau pemilik katalog dapat memberi Anda semua hak istimewa ini. Pemilik skema dapat memberi Anda hak istimewaUSE SCHEMA
danCREATE TABLE
pada skema. - Anda harus dapat membaca tabel dan tampilan yang dirujuk dalam tampilan (
SELECT
pada tabel atau tampilan, sertaUSE CATALOG
pada katalog danUSE SCHEMA
pada skema). - Jika tampilan mereferensikan tabel di metastore Apache Hive lokal ruang kerja, tampilan hanya dapat diakses dari ruang kerja yang berisi tabel ruang kerja-lokal. Untuk alasan ini, Databricks merekomendasikan untuk membuat tampilan hanya dari tabel atau tampilan yang ada di metastore Unity Catalog.
- Anda tidak dapat membuat tampilan yang mereferensikan tampilan yang telah dibagikan dengan Anda menggunakan Berbagi Delta. Lihat Berbagi data dan aset AI dengan aman menggunakan Berbagi Delta.
Untuk membaca tampilan, izin yang diperlukan bergantung pada jenis komputasi dan mode akses:
- Untuk kluster bersama dan gudang SQL, Anda perlu
SELECT
melihat sendiri,USE CATALOG
pada katalog induknya, danUSE SCHEMA
pada skema induknya. - Untuk kluster pengguna tunggal, Anda juga harus memiliki
SELECT
pada semua tabel dan tampilan yang dirujuk tampilan, selainUSE CATALOG
pada katalog induknya danUSE SCHEMA
pada skema induknya.
Untuk membuat atau membaca tampilan dinamis:
- Persyaratan untuk tampilan dinamis sama dengan yang tercantum di bagian sebelumnya, kecuali Bahwa Anda harus menggunakan kluster bersama atau gudang SQL untuk membuat atau membaca tampilan dinamis. Anda tidak dapat menggunakan kluster pengguna tunggal.
Buat tampilan
Untuk membuat tampilan, jalankan perintah SQL berikut. Item dalam tanda kurung bersifat opsional. Ganti nilai tempat penampung:
<catalog-name>
: Nama katalog.<schema-name>
: Nama skema.<view-name>
: Nama untuk tampilan.<query>
: Kueri, kolom, dan tabel serta tampilan yang digunakan untuk menyusun tampilan.
SQL
CREATE VIEW <catalog-name>.<schema-name>.<view-name> AS
SELECT <query>;
Python
spark.sql("CREATE VIEW <catalog-name>.<schema-name>.<view-name> AS "
"SELECT <query>")
R
library(SparkR)
sql(paste("CREATE VIEW <catalog-name>.<schema-name>.<view-name> AS ",
"SELECT <query>",
sep = ""))
Scala
spark.sql("CREATE VIEW <catalog-name>.<schema-name>.<view-name> AS " +
"SELECT <query>")
Misalnya, untuk membuat tampilan bernama sales_redacted
dari kolom dalam tabel sales_raw
:
SQL
CREATE VIEW sales_metastore.sales.sales_redacted AS
SELECT
user_id,
email,
country,
product,
total
FROM sales_metastore.sales.sales_raw;
Python
spark.sql("CREATE VIEW sales_metastore.sales.sales_redacted AS "
"SELECT "
" user_id, "
" email, "
" country, "
" product, "
" total "
"FROM sales_metastore.sales.sales_raw")
R
library(SparkR)
sql(paste("CREATE VIEW sales_metastore.sales.sales_redacted AS ",
"SELECT ",
" user_id, ",
" email, ",
" country, ",
" product, ",
" total ",
"FROM sales_metastore.sales.sales_raw",
sep = ""))
Scala
spark.sql("CREATE VIEW sales_metastore.sales.sales_redacted AS " +
"SELECT " +
" user_id, " +
" email, " +
" country, " +
" product, " +
" total " +
"FROM sales_metastore.sales.sales_raw")
Anda juga dapat membuat tampilan dengan menggunakan penyedia Databricks Terraform dan databricks_table. Anda dapat mengambil daftar tampilan nama lengkap dengan menggunakan databricks_views.
Membuat grup dinamis
Di Katalog Catalog, Anda dapat menggunakan tampilan dinamis untuk mengonfigurasi kontrol akses yang terperinci, termasuk:
- Keamanan pada tingkat kolom atau baris.
- Masking data.
Catatan
Kontrol akses mendetail menggunakan tampilan dinamis tidak tersedia pada kluster dengan mode aksesPengguna Tunggal.
Katalog Unity memperkenalkan fungsi berikut, yang memungkinkan Anda secara dinamis membatasi pengguna mana yang dapat mengakses baris, kolom, atau rekaman dalam tampilan:
current_user()
: Mengembalikan alamat email pengguna saat ini.is_account_group_member()
: MengembalikanTRUE
jika pengguna saat ini adalah anggota grup tingkat akun tertentu. Direkomendasikan untuk digunakan dalam tampilan dinamis terhadap data Katalog Unity.is_member()
: MengembalikanTRUE
jika pengguna saat ini adalah anggota grup tingkat-ruang kerja tertentu. Fungsi ini disediakan untuk kompatibilitas dengan metastore Apache Hive yang ada. Hindari menggunakannya dengan tampilan pada data Katalog Unity, karena tidak mengevaluasi keanggotaan grup tingkat-akun.
Azure Databricks menyarankan agar Anda tidak memberi pengguna kemampuan untuk membaca tabel dan tampilan yang dirujuk dalam tampilan.
Contoh berikut mengilustrasikan cara membuat tampilan dinamis di Katalog Unity.
Izin tingkat-kolom
Dengan tampilan dinamis, Anda dapat membatasi kolom yang dapat diakses oleh pengguna atau grup tertentu. Dalam contoh berikut, hanya anggota grup auditors
yang dapat mengakses alamat email dari tabel sales_raw
. Selama analisis kueri, Apache Spark mengganti pernyataan CASE
dengan string literal REDACTED
atau konten sebenarnya dari kolom alamat email. Kolom lain dikembalikan seperti biasa. Strategi ini tidak berdampak negatif terhadap performa kueri.
SQL
-- Alias the field 'email' to itself (as 'email') to prevent the
-- permission logic from showing up directly in the column name results.
CREATE VIEW sales_redacted AS
SELECT
user_id,
CASE WHEN
is_account_group_member('auditors') THEN email
ELSE 'REDACTED'
END AS email,
country,
product,
total
FROM sales_raw
Python
# Alias the field 'email' to itself (as 'email') to prevent the
# permission logic from showing up directly in the column name results.
spark.sql("CREATE VIEW sales_redacted AS "
"SELECT "
" user_id, "
" CASE WHEN "
" is_account_group_member('auditors') THEN email "
" ELSE 'REDACTED' "
" END AS email, "
" country, "
" product, "
" total "
"FROM sales_raw")
R
library(SparkR)
# Alias the field 'email' to itself (as 'email') to prevent the
# permission logic from showing up directly in the column name results.
sql(paste("CREATE VIEW sales_redacted AS ",
"SELECT ",
" user_id, ",
" CASE WHEN ",
" is_account_group_member('auditors') THEN email ",
" ELSE 'REDACTED' ",
" END AS email, ",
" country, ",
" product, ",
" total ",
"FROM sales_raw",
sep = ""))
Scala
// Alias the field 'email' to itself (as 'email') to prevent the
// permission logic from showing up directly in the column name results.
spark.sql("CREATE VIEW sales_redacted AS " +
"SELECT " +
" user_id, " +
" CASE WHEN " +
" is_account_group_member('auditors') THEN email " +
" ELSE 'REDACTED' " +
" END AS email, " +
" country, " +
" product, " +
" total " +
"FROM sales_raw")
Izin tingkat-baris
Dengan tampilan dinamis, Anda dapat menentukan izin hingga ke tingkat baris atau bidang. Dalam contoh berikut, hanya anggota grup managers
yang dapat melihat jumlah transaksi ketika melebihi $1.000.000. Hasil pencocokan disaring untuk pengguna lain.
SQL
CREATE VIEW sales_redacted AS
SELECT
user_id,
country,
product,
total
FROM sales_raw
WHERE
CASE
WHEN is_account_group_member('managers') THEN TRUE
ELSE total <= 1000000
END;
Python
spark.sql("CREATE VIEW sales_redacted AS "
"SELECT "
" user_id, "
" country, "
" product, "
" total "
"FROM sales_raw "
"WHERE "
"CASE "
" WHEN is_account_group_member('managers') THEN TRUE "
" ELSE total <= 1000000 "
"END")
R
library(SparkR)
sql(paste("CREATE VIEW sales_redacted AS ",
"SELECT ",
" user_id, ",
" country, ",
" product, ",
" total ",
"FROM sales_raw ",
"WHERE ",
"CASE ",
" WHEN is_account_group_member('managers') THEN TRUE ",
" ELSE total <= 1000000 ",
"END",
sep = ""))
Scala
spark.sql("CREATE VIEW sales_redacted AS " +
"SELECT " +
" user_id, " +
" country, " +
" product, " +
" total " +
"FROM sales_raw " +
"WHERE " +
"CASE " +
" WHEN is_account_group_member('managers') THEN TRUE " +
" ELSE total <= 1000000 " +
"END")
Masking data
Karena tampilan di Katalog Unity menggunakan Spark SQL, Anda dapat menerapkan masking data lanjutan dengan menggunakan ekspresi SQL yang lebih kompleks dan ekspresi reguler. Dalam contoh berikut, semua pengguna dapat menganalisis domain email, tetapi hanya anggota grup auditors
yang dapat melihat seluruh alamat email pengguna.
SQL
-- The regexp_extract function takes an email address such as
-- user.x.lastname@example.com and extracts 'example', allowing
-- analysts to query the domain name.
CREATE VIEW sales_redacted AS
SELECT
user_id,
region,
CASE
WHEN is_account_group_member('auditors') THEN email
ELSE regexp_extract(email, '^.*@(.*)$', 1)
END
FROM sales_raw
Python
# The regexp_extract function takes an email address such as
# user.x.lastname@example.com and extracts 'example', allowing
# analysts to query the domain name.
spark.sql("CREATE VIEW sales_redacted AS "
"SELECT "
" user_id, "
" region, "
" CASE "
" WHEN is_account_group_member('auditors') THEN email "
" ELSE regexp_extract(email, '^.*@(.*)$', 1) "
" END "
" FROM sales_raw")
R
library(SparkR)
# The regexp_extract function takes an email address such as
# user.x.lastname@example.com and extracts 'example', allowing
# analysts to query the domain name.
sql(paste("CREATE VIEW sales_redacted AS ",
"SELECT ",
" user_id, ",
" region, ",
" CASE ",
" WHEN is_account_group_member('auditors') THEN email ",
" ELSE regexp_extract(email, '^.*@(.*)$', 1) ",
" END ",
" FROM sales_raw",
sep = ""))
Scala
// The regexp_extract function takes an email address such as
// user.x.lastname@example.com and extracts 'example', allowing
// analysts to query the domain name.
spark.sql("CREATE VIEW sales_redacted AS " +
"SELECT " +
" user_id, " +
" region, " +
" CASE " +
" WHEN is_account_group_member('auditors') THEN email " +
" ELSE regexp_extract(email, '^.*@(.*)$', 1) " +
" END " +
" FROM sales_raw")
Menghapus tampilan
Anda harus menjadi pemilik tampilan untuk menghilangkan tampilan. Untuk menghilangkan tampilan, jalankan perintah SQL berikut:
DROP VIEW IF EXISTS catalog_name.schema_name.view_name;