Crear una vista autorizada en BigQuery

BigQuery es un almacén de datos de estadísticas a escala de petabytes que puedes usar para ejecutar consultas de SQL sobre grandes cantidades de datos casi en tiempo real.

Dar acceso para ver un conjunto de datos también se conoce como crear una vista autorizada en BigQuery. Una vista autorizada te permite compartir resultados de consultas con usuarios y grupos particulares sin darles acceso a las tablas subyacentes. También puedes usar la consulta de SQL de la vista para restringir las columnas (campos) que los usuarios pueden consultar. En este instructivo, crearás una vista autorizada.

Objetivos

En este instructivo podrás hacer lo siguiente:

  • Crear conjuntos de datos y aplicar controles de acceso a ellos
  • Asignar controles de acceso a tu proyecto
  • Crear una vista autorizada que restrinja los datos que los usuarios pueden consultar

Costos

BigQuery es un producto pagado y puedes incurrir en costos de uso de BigQuery en este instructivo. El precio de consulta de BigQuery proporciona el primer 1 TB por mes de forma gratuita. Para obtener más información, consulta los precios de BigQuery.

Antes de comenzar

Antes de comenzar este instructivo, usa Google Cloud Platform Console para crear o seleccionar un proyecto y habilitar la facturación.

  1. Accede a tu Cuenta de Google.

    Si todavía no tienes una cuenta, regístrate para obtener una nueva.

  2. Selecciona o crea un proyecto de GCP.

    Ir a la página Administrar recursos

  3. Comprueba que la facturación esté habilitada en tu proyecto.

    Descubre cómo puedes habilitar la facturación

  4. BigQuery se habilita automáticamente en proyectos nuevos. Para activar BigQuery en un proyecto preexistente, ve a Habilita las BigQuery API necesarias.

    Habilita las API

Introducción

En este instructivo, crearás dos conjuntos de datos: un conjunto de datos para tus datos de origen y un segundo conjunto de datos de tu vista autorizada. Propagas el conjunto de datos fuente con datos del conjunto de datos públicos GitHub. Después, creas una vista que consulta una tabla en el conjunto de datos fuente.

Una vez que creas tus conjuntos de datos y tu vista, asigna controles de acceso al proyecto, al conjunto de datos que contiene la vista y al conjunto de datos que contiene los datos fuente.

Dar acceso a una vista al conjunto de datos de origen también se conoce como la creación de una vista autorizada. Cuando creas una vista autorizada, sigue estos pasos:

  • Crea un conjunto de datos separado para almacenar la vista.
  • Crea la vista en el conjunto de datos nuevo.
  • Asigna controles de acceso al proyecto.
  • Asigna controles de acceso al conjunto de datos que contiene la vista.
  • Autoriza la vista para acceder al conjunto de datos fuente.

Crea un conjunto de datos de origen

Comienza creando un conjunto de datos para almacenar tus datos fuente. Para este instructivo, propaga una tabla en tu conjunto de datos fuente consultando el conjunto de datos públicos GitHub. Los datos en tu conjunto de datos fuente contienen información que no deseas que vean tus análisis de datos. Restringe el acceso a los datos usando una vista autorizada.

Para crear tu conjunto de datos fuente:

IU web

  1. Ve a la IU web de BigQuery.

    Ir a la IU web de BigQuery

  2. Haz clic en el ícono de flecha hacia abajo ícono de flecha hacia abajo que está junto al nombre de tu proyecto en la navegación, luego haz clic en Crear un conjunto de datos nuevo.

  3. Para ID del conjunto de datos escribe github_source_data.

  4. Deja las demás configuraciones predeterminadas en su lugar y haz clic en Aceptar.

Línea de comandos

Usa el comando mk para crear tu conjunto de datos.

bq mk github_source_data

Python

Antes de probar esta muestra, sigue las instrucciones de configuración para Python que se encuentran en la Guía de inicio rápido de BigQuery con bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de Python de BigQuery.

from google.cloud import bigquery

client = bigquery.Client()
source_dataset_id = 'github_source_data'

source_dataset = bigquery.Dataset(client.dataset(source_dataset_id))
# Specify the geographic location where the dataset should reside.
source_dataset.location = 'US'
source_dataset = client.create_dataset(source_dataset)  # API request

Después de crear el conjunto de datos fuente, propaga una tabla con una consulta de SQL. Esto recupera datos de consulta del conjunto de datos públicos de GitHub.

IU web

  1. Ve a la IU web de BigQuery.

    Ir a la IU web de BigQuery

  2. Haz clic en el botón Redactar una consulta.

  3. Copia y pega la siguiente consulta en el cuadro de texto Consulta nueva.

    #standardSQL
    SELECT
    commit,
    author,
    committer,
    repo_name
    FROM
    `bigquery-public-data.github_repos.commits`
    LIMIT
    1000
    
  4. Haz clic en Mostrar opciones.

  5. Para la Tabla de Destino haz clic en Seleccionar Tabla.

  6. En el cuadro de diálogo Seleccionar tabla de destino:

    • Para Proyecto verifica que tu proyecto esté seleccionado.
    • Para Conjunto de datos verifica que github_source_data esté seleccionado.
    • Para ID de tabla escribe: github_contributors.
    • Haz clic en Aceptar.

  7. Haz clic en Ejecutar consulta.

  8. Cuando se complete la consulta, haz clic en github_contributors y luego clic en Vista previa para verificar que los datos se escribieron en la tabla.

Línea de comandos

Usa el comando query con el marcador --destination_table para escribir los resultados de la consulta en una tabla en el conjunto de datos github_source_data.

bq query --destination_table=github_source_data.github_contributors --use_legacy_sql=false 'SELECT commit, author, committer, repo_name FROM
`bigquery-public-data.github_repos.commits` LIMIT 1000'

Python

Antes de probar esta muestra, sigue las instrucciones de configuración para Python que se encuentran en la Guía de inicio rápido de BigQuery con bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de Python de BigQuery.

source_table_id = 'github_contributors'
job_config = bigquery.QueryJobConfig()
job_config.destination = source_dataset.table(source_table_id)
sql = """
    SELECT commit, author, committer, repo_name
    FROM `bigquery-public-data.github_repos.commits`
    LIMIT 1000
"""
query_job = client.query(
    sql,
    # Location must match that of the dataset(s) referenced in the query
    # and of the destination table.
    location='US',
    job_config=job_config)  # API request - starts the query

query_job.result()  # Waits for the query to finish

Crea un conjunto de datos separado para almacenar tu vista

Después de crear tu conjunto de datos fuente, crearás un conjunto de datos nuevo para almacenar la vista que compartirás con tus analistas de datos. Esta vista tendrá acceso a los datos en el conjunto de datos fuente. Tus analistas de datos tendrán acceso a la vista, no a los datos fuente.

Cuando creas la vista, debe crearse en un conjunto de datos independiente de los datos de origen consultados por la vista. Debido a que puedes asignar controles de acceso solo en el nivel del conjunto de datos, si la vista se crea en el mismo conjunto de datos que los datos de fuente, tus analistas de datos tendrán acceso tanto a la vista como a los datos.

Crea un conjunto de datos para almacenar tu vista:

IU web

  1. Ve a la IU web de BigQuery.

    Ir a la IU web de BigQuery

  2. Haz clic en el ícono de flecha hacia abajo ícono de flecha hacia abajo que está junto al nombre de tu proyecto en la navegación, luego haz clic en Crear un conjunto de datos nuevo.

  3. Para el ID de conjunto de datos escribe shared_views.

  4. Deja las demás configuraciones predeterminadas en su lugar y haz clic en Aceptar.

Línea de comandos

Usa el comando mk para crear tu conjunto de datos.

bq mk shared_views

Python

Antes de probar esta muestra, sigue las instrucciones de configuración para Python que se encuentran en la Guía de inicio rápido de BigQuery con bibliotecas cliente. Para obtener más información, consulta la Documentación de referencia de la API de Python de BigQuery.

shared_dataset_id = 'shared_views'
shared_dataset = bigquery.Dataset(client.dataset(shared_dataset_id))
shared_dataset.location = 'US'
shared_dataset = client.create_dataset(shared_dataset)  # API request

Crea la vista en el conjunto de datos nuevo

En el conjunto de datos nuevo, crearás la vista que deseas autorizar. Esta es la vista que compartes con tus analistas de datos. Esta vista se crea mediante una consulta de SQL que excluye las columnas que no deseas que vean los analistas de datos.

Para este instructivo, tu vista compartida excluye toda la información del autor, excepto el nombre del autor, y toda la información del confirmador, excepto el nombre del confirmador.

Sigue los pasos a continuación para crear la vista en el conjunto de datos nuevo:

IU web

  1. Ve a la IU web de BigQuery.

    Ir a la IU web de BigQuery

  2. Haz clic en el botón Redactar una consulta.

  3. Copia y pega la siguiente consulta en el cuadro de texto Consulta nueva. Reemplaza [PROJECT_ID] con tu ID del proyecto.

    #standardSQL
    SELECT
    commit,
    author.name as author,
    committer.name as committer,
    repo_name
    FROM
    `[PROJECT_ID].github_source_data.github_contributors`
    
  4. Haz clic en Mostrar opciones.

  5. Desmarca Usar SQL heredado.

  6. Haz clic en Guardar vista.

  7. En el cuadro de diálogo Guardar vista:

    • Para Proyecto verifica que tu proyecto esté seleccionado.
    • Para Conjunto de datos verifica que shared_views esté seleccionado.
    • Para el ID de tabla escribe: github_analyst_view.
    • Haz clic en Aceptar.

Línea de comandos

Usa el comando mk con el marcador --view. Reemplaza [PROJECT_ID] con tu ID del proyecto.

bq mk --use_legacy_sql=false --view='SELECT commit, author.name as author, committer.name as committer, repo_name FROM `[PROJECT_ID].github_source_data.github_contributors`' shared_views.github_analyst_view

Python

Antes de probar esta muestra, sigue las instrucciones de configuración para Python que se encuentran en la Guía de inicio rápido de BigQuery con bibliotecas cliente. Para obtener más información, consulta la Documentación de referencia de la API de Python de BigQuery.

shared_view_id = 'github_analyst_view'
view = bigquery.Table(shared_dataset.table(shared_view_id))
sql_template = """
    SELECT
        commit, author.name as author,
        committer.name as committer, repo_name
    FROM
        `{}.{}.{}`
"""
view.view_query = sql_template.format(
    client.project, source_dataset_id, source_table_id)
view = client.create_table(view)  # API request

Asigna una función de IAM a nivel de proyecto a tus analistas de datos

Para consultar la vista, tus analistas de datos necesitan permiso de ejecutar trabajos de consulta. La función bigquery.user incluye permisos para ejecutar trabajos, incluidos los trabajos de consulta, dentro del proyecto. Si otorgas a un usuario o grupo la función bigquery.user en el nivel del proyecto, el usuario puede crear conjuntos de datos y puede ejecutar trabajos de consulta en las tablas de esos conjuntos de datos. La función bigquery.user no otorga permiso a los usuarios para consultar datos, ver datos de tabla o ver detalles de esquema de tabla en conjuntos de datos que el usuario no creó.

Asignar a tus analistas de datos a nivel de proyecto la función bigquery.user no les da la capacidad de ver o consultar datos de tablas en el conjunto de datos que contiene las tablas consultadas por la vista. A la mayoría de los individuos (científicos de datos, analistas de inteligencia de negocios, analistas de datos) en una empresa se les debe asignar una función bigquery.user a nivel de proyecto.

Para este instructivo, tus analistas de datos están en un grupo llamado data_analysts@example.com. Este nombre de grupo es solo a modo de ejemplo. Cuando agregas un grupo a una función de IAM, la dirección de correo electrónico y el dominio deben estar asociados con una Cuenta de Google activa o una cuenta de Google Apps.

Para asignar el grupo de analistas de datos a la función bigquery.user a nivel de proyecto:

IU web

  1. Abre la página IAM en Google Cloud Platform Console.

    Abre la página IAM.

  2. Haz clic en Seleccionar un proyecto.

  3. Selecciona tu proyecto y haz clic en Abrir.

  4. En la página IAM, haz clic en Agregar.

  5. En el cuadro de diálogo Agregar miembros:

    • Para miembros escribe el nombre del grupo: data_analysts@example.com.
    • Para funciones, haz clic en Seleccionar una función y elige BigQuery > Usuario BigQuery.
    • Haz clic en Agregar.

Línea de comandos

  1. Para agregar una vinculación única a la política de IAM del proyecto, escribe el siguiente comando. Reemplaza [PROJECT_ID] con tu ID del proyecto.

    gcloud projects add-iam-policy-binding [PROJECT_ID] --member group:data_analysts@example.com --role roles/bigquery.user
    
  2. El comando genera la política actualizada:

    bindings:
    - members:
      - group:data_analysts@example.com
        role: roles/bigquery.user
    

Asigna controles de acceso al conjunto de datos que contiene la vista.

Para que los analistas de datos consulten la vista, necesitan el acceso de READER al conjunto de datos que contiene la vista. La función bigquery.user otorga a tus analistas de datos los permisos necesarios para crear trabajos de consulta, pero no pueden consultar la vista con éxito, a menos que también tengan al menos acceso READER al conjunto de datos que contiene la vista.

Sigue los pasos a continuación para otorgar a los analistas de datos acceso READER al conjunto de datos:

IU web

Estos pasos demuestran la asignación de controles de acceso a un conjunto de datos mediante el uso de la IU web clásica de BigQuery. Actualmente, no puedes asignar controles de acceso con GCP Console.
  1. Haz clic en la flecha desplegable a la derecha del conjunto de datos shared_views y selecciona Compartir conjunto de datos.

  2. En el cuadro de diálogo Compartir conjunto de datos para Agregar personas, haz clic en el menú desplegable a la izquierda del campo y elige Group by e-mail.

  3. Escribe data_analysts@example.com en el cuadro de texto.

  4. A la derecha del campo Agregar personas, verifica que Puedes ver esté seleccionada. "Puedes ver" mapas en la función bigquery.dataViewer en el nivel de conjunto de datos.

  5. Haz clic en Agregar y luego en Guardar cambios.

Línea de comandos

  1. Cuando aplicas controles de acceso a un conjunto de datos usando la herramienta de línea de comandos, los controles existentes se sobrescriben. Primero, exporta los controles de acceso existentes a un archivo JSON con el comando show.

    bq --format=json show shared_views >shared_views.json
    
  2. Realiza tus cambios en la sección de "acceso" del archivo JSON con la función READER y groupByEmail.

    Por ejemplo:

    {
     "access": [
      {
       "role": "READER",
       "specialGroup": "projectReaders"
      },
      {
       "role": "WRITER",
       "specialGroup": "projectWriters"
      },
      {
       "role": "OWNER",
       "specialGroup": "projectOwners"
      }
      {
       "role": "READER",
       "specialGroup": "allAuthenticatedUsers"
      }
      {
       "role": "READER",
       "domain": "[DOMAIN_NAME]"
      }
      {
       "role": "WRITER",
       "userByEmail": "[USER_EMAIL]"
      }
      {
       "role": "READER",
       "groupByEmail": "data_analysts@example.com"
      }
     ],
    }
    

  3. Cuando tus ediciones estén completas, usa el comando update y también incluye el archivo JSON usando el marcador --source.

    bq update --source=shared_views.json shared_views

  4. Para verificar los cambios de control de acceso, usa el comando show.

    bq show shared_views

Python

Antes de probar esta muestra, sigue las instrucciones de configuración para Python que se encuentran en la Guía de inicio rápido de BigQuery con bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de Python de BigQuery.

# analyst_group_email = 'data_analysts@example.com'
access_entries = shared_dataset.access_entries
access_entries.append(
    bigquery.AccessEntry('READER', 'groupByEmail', analyst_group_email)
)
shared_dataset.access_entries = access_entries
shared_dataset = client.update_dataset(
    shared_dataset, ['access_entries'])  # API request

Autoriza la vista para acceder al conjunto de datos fuente.

Una vez que crees los controles de acceso para el conjunto de datos que contiene la vista, agrega la vista como una vista autorizada en el conjunto de datos fuente. Esto le da a la vista acceso a los datos fuente, no a tu grupo de analistas de datos.

Autoriza la vista para acceder a los datos fuente:

IU web

  1. Haz clic en la flecha desplegable a la derecha del conjunto de datos github_source_data y elige Compartir conjunto de datos.

  2. En el cuadro de diálogo Compartir conjunto de datos para Agregar personas, haz clic en el menú desplegable a la izquierda del campo y selecciona Vista autorizada.

  3. Haz clic en Seleccionar vista.

  4. En el cuadro de diálogo Seleccionar vista:

    • Para **Proyecto**, verifica que tu proyecto esté seleccionado.
    • Para **Conjunto de datos**, elige shared_views.
    • Para **ID de tabla**, escribe el nombre de la vista: `github_analyst_view`.
    • Haz clic en **Aceptar**.
  5. Haz clic en Agregar y luego en Guardar cambios.

Línea de comandos

  1. Cuando aplicas controles de acceso a un conjunto de datos usando la CLI, los controles existentes se sobrescriben. Primero, exporta los controles de acceso existentes a un archivo JSON con el comando show.

    bq --format=prettyjson show github_source_data >github_source_data.json
    
  2. Agrega la vista autorizada a la sección de "acceso" del archivo JSON. Reemplaza [PROJECT_ID] con tu ID del proyecto.

    Por ejemplo:

    {
     "access": [
      {
       "role": "READER",
       "specialGroup": "projectReaders"
      },
      {
       "view":{
       "datasetId": "shared_views",
       "projectId": "[PROJECT_ID]",
       "tableId": "github_analyst_view"
       }
      },
      ...
     ],
     ...
    }
    

    Parte del texto en el archivo JSON se omite por brevedad.

  3. Cuando tus ediciones estén completas, usa el comando update y también incluye el archivo JSON usando el marcador --source.

    bq update --source=github_source_data.json github_source_data

  4. Para verificar los cambios de control de acceso, usa el comando show.

    bq show github_source_data

Python

Antes de probar esta muestra, sigue las instrucciones de configuración para Python que se encuentran en la Guía de inicio rápido de BigQuery con bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de Python de BigQuery.

access_entries = source_dataset.access_entries
access_entries.append(
    bigquery.AccessEntry(None, 'view', view.reference.to_api_repr())
)
source_dataset.access_entries = access_entries
source_dataset = client.update_dataset(
    source_dataset, ['access_entries'])  # API request

Verifica la configuración

Cuando se completa la configuración, un miembro del grupo data_analysts puede verificar la configuración consultando la vista.

Sigue los pasos a continuación para verificar la configuración:

IU web

  1. Haz que un miembro del grupo data_analysts vaya a la IU web de BigQuery.

    Ir a la IU web de BigQuery

  2. Haz clic en el botón Redactar una consulta.

  3. Copia y pega la siguiente consulta en el cuadro de texto Consulta nueva.

    #standardSQL
    SELECT
    *
    FROM
    `shared_views.github_analyst_view`
    

Línea de comandos

Usa el comando query para consultar la vista.

bq query --use_legacy_sql=false 'SELECT * FROM `shared_views.github_analyst_view`'

Código fuente completo

Aquí se encuentra el código fuente completo para el instructivo y tu referencia.

Python

Antes de probar esta muestra, sigue las instrucciones de configuración para Python que se encuentran en la Guía de inicio rápido de BigQuery con bibliotecas cliente. Para obtener más información, consulta la Documentación de referencia de la API de Python de BigQuery.

# Create a source dataset
from google.cloud import bigquery

client = bigquery.Client()
source_dataset_id = 'github_source_data'

source_dataset = bigquery.Dataset(client.dataset(source_dataset_id))
# Specify the geographic location where the dataset should reside.
source_dataset.location = 'US'
source_dataset = client.create_dataset(source_dataset)  # API request

# Populate a source table
source_table_id = 'github_contributors'
job_config = bigquery.QueryJobConfig()
job_config.destination = source_dataset.table(source_table_id)
sql = """
    SELECT commit, author, committer, repo_name
    FROM `bigquery-public-data.github_repos.commits`
    LIMIT 1000
"""
query_job = client.query(
    sql,
    # Location must match that of the dataset(s) referenced in the query
    # and of the destination table.
    location='US',
    job_config=job_config)  # API request - starts the query

query_job.result()  # Waits for the query to finish

# Create a separate dataset to store your view
shared_dataset_id = 'shared_views'
shared_dataset = bigquery.Dataset(client.dataset(shared_dataset_id))
shared_dataset.location = 'US'
shared_dataset = client.create_dataset(shared_dataset)  # API request

# Create the view in the new dataset
shared_view_id = 'github_analyst_view'
view = bigquery.Table(shared_dataset.table(shared_view_id))
sql_template = """
    SELECT
        commit, author.name as author,
        committer.name as committer, repo_name
    FROM
        `{}.{}.{}`
"""
view.view_query = sql_template.format(
    client.project, source_dataset_id, source_table_id)
view = client.create_table(view)  # API request

# Assign access controls to the dataset containing the view
# analyst_group_email = 'data_analysts@example.com'
access_entries = shared_dataset.access_entries
access_entries.append(
    bigquery.AccessEntry('READER', 'groupByEmail', analyst_group_email)
)
shared_dataset.access_entries = access_entries
shared_dataset = client.update_dataset(
    shared_dataset, ['access_entries'])  # API request

# Authorize the view to access the source dataset
access_entries = source_dataset.access_entries
access_entries.append(
    bigquery.AccessEntry(None, 'view', view.reference.to_api_repr())
)
source_dataset.access_entries = access_entries
source_dataset = client.update_dataset(
    source_dataset, ['access_entries'])  # API request

Limpieza

Sigue estos pasos para evitar que se apliquen cargos a tu cuenta de Google Cloud Platform por los recursos que usaste en este instructivo:

  1. En la GCP Console, dirígete a la página Proyectos.

    Ir a la página Proyectos

  2. En la lista de proyectos, selecciona el proyecto que deseas borrar y haz clic en Borrar.
  3. En el cuadro de diálogo, escribe el ID del proyecto y, luego, haz clic en Cerrar para borrar el proyecto.

¿Qué sigue?

¿Te ha resultado útil esta página? Enviar comentarios:

Enviar comentarios sobre...

Si necesitas ayuda, visita nuestra página de asistencia.