Bagikan melalui


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 izin USE SCHEMA dan CREATE TABLE pada skema induk. Admin metastore atau pemilik katalog dapat memberi Anda semua hak istimewa ini. Pemilik skema dapat memberi Anda hak istimewa USE SCHEMA dan CREATE TABLE pada skema.
  • Anda harus dapat membaca tabel dan tampilan yang dirujuk dalam tampilan (SELECT pada tabel atau tampilan, serta USE CATALOG pada katalog dan USE 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, dan USE SCHEMA pada skema induknya.
  • Untuk kluster pengguna tunggal, Anda juga harus memiliki SELECT pada semua tabel dan tampilan yang dirujuk tampilan, selain USE CATALOG pada katalog induknya dan USE 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(): Mengembalikan TRUE jika pengguna saat ini adalah anggota grup tingkat akun tertentu. Direkomendasikan untuk digunakan dalam tampilan dinamis terhadap data Katalog Unity.
  • is_member(): Mengembalikan TRUE 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;

Langkah berikutnya