إنشاء طرق العرض

توضح هذه المقالة كيفية إنشاء طرق عرض في كتالوج Unity.

طريقة العرض هي كائن للقراءة فقط يتكون من جدول واحد أو أكثر وطرق عرض في metastore. وهو موجود في الطبقة الثالثة من مساحة الاسم ثلاثية المستوى في كتالوج Unity. يمكن إنشاء طريقة عرض من الجداول وطرق العرض الأخرى في مخططات وكتالوجات متعددة.

يمكن استخدام طرق العرض الديناميكية لتوفير التحكم في الوصول على مستوى الصف والعمود، بالإضافة إلى إخفاء البيانات.

مثال على بناء الجملة لإنشاء طريقة عرض:

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;

إشعار

قد يكون لطرق العرض دلالات تنفيذ مختلفة إذا كانت مدعومة بمصادر بيانات أخرى غير جداول Delta. توصي Databricks بتعريف طرق العرض دائما عن طريق الرجوع إلى مصادر البيانات باستخدام اسم جدول أو عرض. يمكن أن يؤدي تحديد طرق العرض مقابل مجموعات البيانات عن طريق تحديد مسار أو URI إلى إرباك متطلبات إدارة البيانات.

المتطلبات

لإنشاء طريقة عرض:

  • يجب أن يكون لديك الإذن على USE CATALOG الكتالوج الأصل والأذونات و USE SCHEMACREATE TABLE على المخطط الأصل. يمكن لمسؤول metastore أو مالك الكتالوج أن يمنحك كل هذه الامتيازات. يمكن لمالك المخطط منحك USE SCHEMA وامتيازات CREATE TABLE على المخطط.
  • يجب أن تكون قادرا على قراءة الجداول وطرق العرض المشار إليها في طريقة العرض (SELECT على الجدول أو طريقة العرض، وكذلك USE CATALOG في الكتالوج وعلى USE SCHEMA المخطط).
  • إذا كانت طريقة العرض تشير إلى الجداول في مخزن بيانات تعريف Hive المحلي لمساحة العمل، يمكن الوصول إلى طريقة العرض فقط من مساحة العمل التي تحتوي على الجداول المحلية لمساحة العمل. لهذا السبب، توصي Databricks بإنشاء طرق عرض فقط من الجداول أو طرق العرض الموجودة في مخزن بيانات تعريف كتالوج Unity.
  • لا يمكنك إنشاء طريقة عرض تشير إلى طريقة عرض تمت مشاركتها معك باستخدام Delta Sharing. راجع مشاركة البيانات والأصول الذكاء الاصطناعي بأمان باستخدام Delta Sharing.

لقراءة طريقة عرض، تعتمد الأذونات المطلوبة على نوع الحساب ووضع الوصول:

  • بالنسبة للمجموعات المشتركة ومستودعات SQL، تحتاج إلى SELECT طريقة العرض نفسها، USE CATALOG وعلى الكتالوج الأصل، وعلى USE SCHEMA مخططها الأصل.
  • بالنسبة لمجموعات المستخدمين الفرديين، يجب أن يكون لديك SELECT أيضا على جميع الجداول وطرق العرض التي تشير إليها طريقة العرض، بالإضافة إلى USE CATALOG الكتالوجات الأصلية الخاصة بهم وعلى USE SCHEMA المخططات الأصلية الخاصة بهم.

لإنشاء طرق عرض ديناميكية أو قراءتها:

  • متطلبات طرق العرض الديناميكية هي نفسها تلك المدرجة في الأقسام السابقة، باستثناء أنه يجب عليك استخدام مجموعة مشتركة أو مستودع SQL لإنشاء طريقة عرض ديناميكية أو قراءتها. لا يمكنك استخدام مجموعات مستخدم واحد.

إنشاء طريقة عرض

لإنشاء طريقة عرض، قم بتشغيل أمر SQL التالي. العناصر الموجودة بين قوسين اختيارية. استبدل قيم العنصر النائب:

  • <catalog-name>: اسم الكتالوج.
  • <schema-name>: اسم المخطط.
  • <view-name>: اسم ل طريقة العرض.
  • <query>: الاستعلام والأعمدة والجداول وطرق العرض المستخدمة لإنشاء طريقة العرض.

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>")

على سبيل المثال، لإنشاء طريقة عرض مسماة sales_redacted من أعمدة في 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")

يمكنك أيضا إنشاء طريقة عرض باستخدام موفر Databricks Terraform databricks_table. يمكنك استرداد قائمة عرض الأسماء الكاملة باستخدام databricks_views.

إنشاء طريقة عرض ديناميكية

في كتالوج Unity، يمكنك استخدام طرق العرض الديناميكية لتكوين التحكم في الوصول الدقيق، بما في ذلك:

  • الأمان على مستوى الأعمدة أو الصفوف.
  • إخفاء البيانات.

إشعار

لا يتوفر التحكم في الوصول الدقيق باستخدام طرق العرض الديناميكية على أنظمة المجموعات التي تتضمن وضع وصول مستخدمواحد.

يقدم كتالوج Unity الوظائف التالية، والتي تسمح لك بتحديد المستخدمين الذين يمكنهم الوصول إلى صف أو عمود أو سجل ديناميكيا في طريقة عرض:

  • current_user(): إرجاع عنوان البريد الإلكتروني للمستخدم الحالي.
  • is_account_group_member(): إرجاع TRUE إذا كان المستخدم الحالي عضوا في مجموعة معينة على مستوى الحساب. يوصى باستخدامه في طرق العرض الديناميكية مقابل بيانات كتالوج Unity.
  • is_member(): إرجاع TRUE إذا كان المستخدم الحالي عضوا في مجموعة محددة على مستوى مساحة العمل. يتم توفير هذه الدالة للتوافق مع Hive metastore الموجود. تجنب استخدامه مع طرق العرض مقابل بيانات كتالوج Unity، لأنه لا يقيم عضوية المجموعة على مستوى الحساب.

توصي Azure Databricks بعدم منح المستخدمين القدرة على قراءة الجداول وطرق العرض المشار إليها في طريقة العرض.

توضح الأمثلة التالية كيفية إنشاء طرق عرض ديناميكية في كتالوج Unity.

أذونات على مستوى العمود

باستخدام طريقة عرض ديناميكية، يمكنك تحديد الأعمدة التي يمكن لمستخدم أو مجموعة معينة الوصول إليها. في المثال التالي، يمكن لأعضاء auditors المجموعة فقط الوصول إلى عناوين البريد الإلكتروني من sales_raw الجدول. أثناء تحليل الاستعلام، يستبدل Apache Spark العبارة CASE إما بالسلسلة REDACTED الحرفية أو المحتويات الفعلية لعمود عنوان البريد الإلكتروني. يتم إرجاع أعمدة أخرى كالمعتاد. هذه الاستراتيجية ليس لها أي تأثير سلبي على أداء الاستعلام.

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")

أذونات على مستوى الصف

باستخدام طريقة عرض ديناميكية، يمكنك تحديد الأذونات وصولا إلى مستوى الصف أو الحقل. في المثال التالي، يمكن لأعضاء managers المجموعة فقط عرض مبالغ المعاملات عندما تتجاوز 1000000 دولار. تتم تصفية النتائج المطابقة للمستخدمين الآخرين.

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")

إخفاء البيانات

نظرا لأن طرق العرض في كتالوج Unity تستخدم Spark SQL، يمكنك تنفيذ إخفاء البيانات المتقدم باستخدام تعبيرات SQL أكثر تعقيدا والتعبيرات العادية. في المثال التالي، يمكن لجميع المستخدمين تحليل مجالات البريد الإلكتروني، ولكن يمكن لأعضاء auditors المجموعة فقط عرض عنوان البريد الإلكتروني بالكامل للمستخدم.

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")

إسقاط طريقة عرض

يجب أن تكون مالك طريقة العرض لإسقاط طريقة العرض. لإسقاط طريقة عرض، قم بتشغيل أمر SQL التالي:

DROP VIEW IF EXISTS catalog_name.schema_name.view_name;

الخطوات التالية