Erstellen von Ansichten

In diesem Artikel erfahren Sie, wie Sie Ansichten in Unity Catalog erstellen.

Eine Sicht ist ein schreibgeschütztes Objekt, das aus einer oder mehreren Tabellen und Sichten in einem Metastore besteht. Sie befindet sich in der dritten Ebene des Namespace mit drei Ebenen von Unity Catalog. Eine Sicht kann aus Tabellen und anderen Sichten in mehreren Schemas oder Katalogen erstellt werden.

Dynamische Ansichten können verwendet werden, um zusätzlich zur Datenmaskierung eine Zugriffskontrolle auf Zeilen- und Spaltenebene bereitzustellen.

Beispielsyntax zum Erstellen einer Ansicht:

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;

Hinweis

Ansichten weisen möglicherweise unterschiedliche Ausführungssemantik auf, wenn sie von anderen Datenquellen als Delta-Tabellen gesichert werden. Databricks empfiehlt, Ansichten immer durch Verweisen auf Datenquellen mithilfe eines Tabellen- oder Ansichtsnamens zu definieren. Das Definieren von Ansichten für Datasets durch Angeben eines Pfads oder URI kann zu verwirrenden Datengovernanceanforderungen führen.

Anforderungen

So erstellen Sie eine Sicht:

  • Sie benötigen die USE CATALOG-Berechtigung für den übergeordneten Katalog und die USE SCHEMA- und CREATE TABLE-Berechtigungen für das übergeordnete Schema. Ein Metastoreadministrator oder der Katalogbesitzer kann Ihnen all diese Berechtigungen gewähren. Ein Schemabesitzer kann Ihnen die Berechtigungen USE SCHEMA und CREATE TABLE für das Schema erteilen.
  • Sie müssen in der Lage sein, die Tabellen und Ansichten zu lesen, auf die in der Ansicht verwiesen wird (SELECT sowohl in der Tabelle oder Ansicht als auch USE CATALOG im Katalog und USE SCHEMA im Schema).
  • Wenn eine Ansicht auf Tabellen im arbeitsbereichslokalen Hive-Metastore verweist, kann auf die Ansicht nur von dem Arbeitsbereich aus zugegriffen werden, der die arbeitsbereichslokalen Tabellen enthält. Aus diesem Grund empfiehlt Databricks, Ansichten nur aus Tabellen oder Ansichten zu erstellen, die sich im Metastore von Unity Catalog befinden.
  • Sie können keine Ansicht erstellen, die auf eine Ansicht verweist, die mit Delta Sharing für Sie freigegeben wurde. Weitere Informationen unter Sicheres Freigeben von Daten und KI-Ressourcen mithilfe von Delta Sharing.

Zum Lesen einer Ansicht hängen die erforderlichen Berechtigungen vom Computetyp und Zugriffsmodus ab:

  • Für freigegebene Cluster und SQL Warehouses benötigen Sie SELECT in der Ansicht selbst, USE CATALOG im übergeordneten Katalog und USE SCHEMA im übergeordneten Schema.
  • Bei Einzelbenutzerclustern müssen Sie auch über SELECT in allen Tabellen und Ansichten verfügen, auf welche die Ansicht verweist, zusätzlich zu USE CATALOG in ihren übergeordneten Katalogen und USE SCHEMA in ihren übergeordneten Schemas.

So erstellen oder lesen Sie dynamische Ansichten:

  • Die Anforderungen für dynamische Ansichten sind identisch mit denen, die in den vorherigen Abschnitten aufgeführt sind, mit der Ausnahme, dass Sie einen freigegebenen Cluster oder ein SQL Warehouse zum Erstellen oder Lesen einer dynamischen Ansicht verwenden müssen. Sie können keine Einzelbenutzercluster verwenden.

Erstellen einer Ansicht

Führen Sie den folgenden SQL Befehl aus, um eine Ansicht zu erstellen. Elemente in Klammern sind optional. Ersetzen Sie folgende Platzhalterwerte:

  • <catalog-name>: Der Name des Katalogs.
  • <schema-name>: Der Name des Schemas.
  • <view-name>: Ein Name für die Ansicht.
  • <query>: Die Abfrage, Spalten, Tabellen und Ansichten, die zum Zusammenstellen der Ansicht verwendet werden.

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

So erstellen Sie beispielsweise eine Ansicht namens sales_redacted aus Spalten in der sales_raw-Tabelle:

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

Sie können auch eine Ansicht erstellen, indem Sie den Databricks-Terraform-Anbieter und databricks_table verwenden. Sie können eine Liste der vollständigen Namen der Ansichten mithilfe von databricks_views abrufen.

Erstellen einer dynamischen Ansicht

In Unity Catalog können Sie dynamische Ansichten verwenden, um eine differenzierte Zugriffssteuerung zu konfigurieren, die unter anderem Folgendes ermöglicht:

  • Sicherheit auf Spalten- oder Zeilenebene
  • Datenmaskierung

Hinweis

Eine differenzierte Zugriffssteuerung mit dynamischen Ansichten ist in Clustern mit dem Zugriffsmodus für Einzelbenutzer nicht verfügbar.

Unity Catalog führt die folgenden Funktionen ein, mit denen Sie dynamisch einschränken können, welche Benutzer*innen auf eine Zeile, Spalte oder einen Datensatz in einer Ansicht zugreifen können:

  • current_user(): Gibt die E-Mail-Adresse des oder der aktuellen Benutzer*in zurück
  • is_account_group_member(): Gibt TRUE zurück, wenn der oder die aktuelle Benutzer*in Mitglied einer bestimmten Gruppe auf Kontoebene ist Diese Option wird empfohlen, wenn dynamische Ansichten mit Unity Catalog-Daten verwendet werden.
  • is_member(): Gibt TRUE zurück, wenn der oder die aktuelle Benutzer*in Mitglied einer bestimmten Gruppe auf Arbeitsbereichebene ist Diese Funktion soll für Kompatibilität mit dem vorhandenen Hive-Metastore sorgen. Sie sollten sie nicht für Ansichten mit Unity Catalog-Daten verwenden, da sie die Gruppenmitgliedschaft nicht auf Kontoebene auswertet.

Azure Databricks empfiehlt, Benutzern nicht die Möglichkeit zu gewähren, die Tabellen und Ansichten zu lesen, auf die in der Ansicht verwiesen wird.

Die folgenden Beispiele veranschaulichen, wie dynamische Ansichten in Unity Catalog erstellt werden.

Berechtigungen auf Spaltenebene

Mit einer dynamischen Ansicht können Sie die Spalten einschränken, auf die ein*e bestimmte*r Benutzer*in oder eine bestimmte Gruppe zugreifen kann. Im folgenden Beispiel können nur Mitglieder der Gruppe auditors über die Tabelle sales_raw auf E-Mail-Adressen zugreifen. Während der Abfrageanalyse ersetzt Apache Spark die CASE-Anweisung entweder durch die Literalzeichenfolge REDACTED oder den tatsächlichen Inhalt der Spalte für E-Mail-Adressen. Andere Spalten werden wie gewohnt zurückgegeben. Diese Strategie hat keine negativen Auswirkungen auf die Abfrageleistung.

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

Zeilenspezifische Berechtigungen

Mit einer dynamischen Ansicht können Sie Berechtigungen bis auf Zeilen- oder Feldebene festlegen. Im folgenden Beispiel können nur Mitglieder der Gruppe managers Transaktionsbeträge anzeigen, wenn diese 1.000.000 USD überschreiten. Übereinstimmende Ergebnisse werden für andere Benutzer*innen herausgefiltert.

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

Datenmaskierung

Da Ansichten in Unity Catalog Spark SQL verwenden, können Sie die erweiterte Datenmaskierung implementieren, indem Sie komplexere SQL-Ausdrücke und reguläre Ausdrücke verwenden. Im folgenden Beispiel können alle Benutzer*innen E-Mail-Domänen analysieren, aber nur Mitglieder der Gruppe auditors können die ganze E-Mail-Adresse eines oder einer Benutzer*in anzeigen.

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

Löschen einer Sicht

Sie müssen der Besitzer der Ansicht sein, um eine Ansicht löschen zu können. Führen Sie den folgenden SQL Befehl aus, um eine Ansicht abzulegen.

DROP VIEW IF EXISTS catalog_name.schema_name.view_name;

Nächste Schritte