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 permisosUSE SCHEMA
yCREATE 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 privilegiosUSE SCHEMA
yCREATE 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í comoUSE CATALOG
en el catálogo yUSE 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 yUSE 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 deUSE CATALOG
en sus catálogos principales yUSE 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()
: devuelveTRUE
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()
: devuelveTRUE
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
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de