Creación de vistas

En este artículo se muestra cómo crear vistas en el catálogo de Unity.

Una vista es un objeto de solo lectura compuesto por una o varias tablas y vistas de un metastore. Se encuentra en la tercera capa del espacio de nombres de tres niveles de Unity Catalog. Una vista se puede crear a partir de tablas y otras vistas de varios esquemas y catálogos.

Las vistas dinámicas se pueden usar para proporcionar control de acceso a nivel de fila y columna, además del enmascaramiento de datos.

Ejemplo de sintaxis para la creación de una vista:

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;

Nota:

Las vistas pueden tener una semántica de ejecución diferente si están respaldadas por orígenes de datos distintos de las tablas Delta. Databricks recomienda definir siempre las vistas haciendo referencia a orígenes de datos mediante un nombre de tabla o vista. La definición de vistas en conjuntos de datos especificando una ruta de acceso o un URI puede dar lugar a requisitos confusos de gobernanza de datos.

Requisitos

Para crear una vista:

  • Debe tener el permiso USE CATALOG sobre el catálogo principal y los permisos USE SCHEMA y CREATE TABLE sobre el esquema principal. Un administrador de metastore o el propietario del catálogo puede concederle todos estos privilegios. Un propietario de esquema puede concederle privilegios USE SCHEMA y CREATE TABLE en el esquema.
  • Debe tener la capacidad de leer las tablas y vistas a las que se hace referencia en la vista (SELECT en la tabla o vista, así como USE CATALOG en el catálogo y USE SCHEMA en el esquema).
  • Si una vista hace referencia a tablas en el metastore de Hive local del área de trabajo, solo se podrá acceder a la vista desde el área de trabajo que contenga las tablas locales del área de trabajo. Por este motivo, Databricks recomienda la creación de vistas solo desde tablas o vistas que se encuentren en el metastore de Unity Catalog.
  • No puede crear una vista que haga referencia a una vista que se haya compartido con usted mediante Delta Sharing. Consulte Uso seguro de recursos de uso compartido de datos e inteligencia artificial mediante Delta Sharing.

Para leer una vista, los permisos necesarios dependen del tipo de cálculo y del modo de acceso:

  • Para los clústeres compartidos y almacenes SQL, necesita SELECT en la propia vista, USE CATALOG en su catálogo principal y USE SCHEMA en su esquema principal.
  • En el caso de los clústeres de usuario único, también debe tener SELECT en todas las tablas y vistas a las que hace referencia la vista, además de USE CATALOG en sus catálogos principales y USE SCHEMA en sus esquemas principales.

Para crear o leer vistas dinámicas:

  • Los requisitos de las vistas dinámicas son los mismos que los enumerados en las secciones anteriores, excepto que debe usar un clúster compartido o un almacenamiento de SQL para crear o leer una vista dinámica. No se pueden usar clústeres de usuario único.

Creación de una vista

Para crear una vista, ejecute el siguiente comando SQL. Los elementos entre corchetes son opcionales. Reemplace los valores de marcador de posición:

  • <catalog-name>: El nombre del catálogo.
  • <schema-name>: nombre del esquema.
  • <view-name>: nombre de la vista.
  • <query>: la consulta, las columnas, las tablas y las vistas que se usan para componer la vista.

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

Por ejemplo, para crear una vista llamada sales_redacted a partir de las columnas de la tabla 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")

También puede crear una vista mediante el proveedor Terraform de Databricks y databricks_table. Puede recuperar una lista de nombres completos de vista mediante databricks_views.

Creación de una vista dinámica

En el catálogo de Unity, puede usar vistas dinámicas para configurar control de acceso pormenorizado, lo que incluye:

  • Seguridad en el nivel de columnas o filas.
  • Enmascaramiento de datos.

Nota:

El control de acceso detallado mediante vistas dinámicas no está disponible en clústeres con el modo de acceso deusuario único.

El catálogo de Unity presenta las funciones siguientes, que permiten limitar dinámicamente qué usuarios pueden acceder a una fila, columna o registro de una vista:

  • current_user(): devuelve la dirección de correo electrónico del usuario actual.
  • is_account_group_member(): devuelve TRUE si el usuario actual es miembro de un grupo de nivel de cuenta específico. Se recomienda su uso en vistas dinámicas con datos del catálogo de Unity.
  • is_member(): devuelve TRUE si el usuario actual es miembro de un grupo de nivel de área de trabajo específico. Esta función se proporciona por compatibilidad con el repositorio metastore de Hive existente. Evite usarla con vistas de los datos del catálogo de Unity, ya que no evalúa la pertenencia a grupos de nivel de cuenta.

Azure Databricks recomienda no conceder a los usuarios la capacidad de leer las tablas y vistas a las que se hace referencia en la vista.

En los ejemplos siguientes se muestra cómo crear vistas dinámicas en el catálogo de Unity.

Permisos de nivel de columna

Con una vista dinámica, puede limitar las columnas a las que puede acceder un usuario o grupo determinado. En el ejemplo siguiente, solo los miembros del grupo auditors pueden acceder a las direcciones de correo electrónico de la tabla sales_raw. Durante el análisis de consultas, Apache Spark reemplaza la instrucción CASE por la cadena literal REDACTED o el contenido real de la columna de dirección de correo electrónico. Otras columnas se devuelven con normalidad. Esta estrategia no tiene ningún efecto negativo en el rendimiento de las consultas.

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

Permisos de nivel de fila

Con una vista dinámica, puede especificar permisos hasta el nivel de fila o campo. En el ejemplo siguiente, solo los miembros del grupo managers pueden ver los importes de transacciones cuando superan 1 000 000 USD. Los resultados coincidentes se filtran para otros usuarios.

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

Enmascaramiento de datos

Dado que las vistas del catálogo de Unity usan Spark SQL, puede implementar enmascaramiento de datos avanzado mediante expresiones SQL y expresiones regulares más complejas. En el ejemplo siguiente, todos los usuarios pueden analizar los dominios de correo electrónico, pero solo los miembros del grupo auditors pueden ver la dirección de correo electrónico completa de un usuario.

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

Quitar una vista

Debe ser el propietario de la vista para quitar una vista. Para colocar una vista, ejecute el siguiente comando SQL:

DROP VIEW IF EXISTS catalog_name.schema_name.view_name;

Pasos siguientes