Descarga datos de BigQuery a Pandas mediante la API de almacenamiento de BigQuery

La API de almacenamiento de BigQuery proporciona acceso rápido a los datos almacenados en BigQuery. Usa la API de almacenamiento de BigQuery para descargar datos almacenados en BigQuery y usarlos en herramientas de estadísticas como la biblioteca de Pandas para Python.

Objetivos

En este instructivo, harás lo siguiente:

  • Descargar los resultados de las consultas en un DataFrame de Pandas mediante la API de almacenamiento de BigQuery desde los comandos mágicos de IPython para BigQuery en un notebook de Jupyter
  • Descargar los resultados de las consultas a un DataFrame de Pandas mediante la biblioteca cliente de BigQuery para Python
  • Descargar los datos de las tablas de BigQuery a un DataFrame de Pandas mediante la biblioteca cliente de BigQuery para Python
  • Descargar los datos de las tablas de BigQuery a un DataFrame de Pandas mediante la biblioteca cliente de la API de almacenamiento de BigQuery para Python

Costos

BigQuery es un producto pago que generará costos de uso de BigQuery por las consultas que ejecutes. Tienes 1 TB gratis de procesamiento de datos de consulta por mes. Para obtener más información, consulta la página de precios de BigQuery.

La API de almacenamiento de BigQuery es un producto pago que generará costos de uso por los datos de tabla que escanees cuando descargues un DataFrame. Para obtener más información, consulta la página de 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 de forma automática en proyectos nuevos. Para activar BigQuery en un proyecto preexistente, Habilita las BigQuery, API de almacenamiento de BigQuery API necesarias.

    Habilita las API

  5. Configura un entorno de desarrollo de Python.
    Configurar Python
  6. Configura la autenticación para tu entorno de desarrollo.
    Configurar la autenticación

Antes de completar este instructivo, también debes estar familiarizado con los comandos mágicos de IPython para BigQuery, la biblioteca cliente de BigQuery y el uso de la biblioteca cliente con Pandas.

Instala las bibliotecas cliente

Instala la versión 1.9.0 o superior de la biblioteca cliente de BigQuery para Python y la biblioteca cliente de la API de almacenamiento de BigQuery para Python.

PIP

Instala los paquetes google-cloud-bigquery y google-cloud-bigquery-storage.

pip install --upgrade google-cloud-bigquery[bqstorage,pandas]

Conda

Instala los paquetes de Conda correspondientes a BigQuery y la API de almacenamiento de BigQuery desde el canal administrado por la comunidad conda-forge.

conda install -c conda-forge google-cloud-bigquery \
  google-cloud-bigquery-storage \
  pandas \
  pyarrow

Descarga los resultados de las consultas mediante los comandos mágicos de IPython para BigQuery

Inicia el servidor de notebooks de Jupyter y crea un notebook nuevo. Carga los comandos mágicos de IPython para BigQuery mediante el comando mágico %load_ext.

%load_ext google.cloud.bigquery

Agrega el argumento --use_bq_storage_api a los comandos mágicos %%bigquery para descargar los resultados de las consultas grandes con la API de almacenamiento de BigQuery.

%%bigquery nodejs_deps --use_bqstorage_api
SELECT
    dependency_name,
    dependency_platform,
    project_name,
    project_id,
    version_number,
    version_id,
    dependency_kind,
    optional_dependency,
    dependency_requirements,
    dependency_project_id
FROM
    `bigquery-public-data.libraries_io.dependencies`
WHERE
    LOWER(dependency_platform) = 'npm'
LIMIT 2500000

Cuando este argumento se usa con resultados de consultas pequeñas, los comandos mágicos usan la API de BigQuery para descargar los resultados.

%%bigquery stackoverflow --use_bqstorage_api
SELECT
  CONCAT(
    'https://stackoverflow.com/questions/',
    CAST(id as STRING)) as url,
  view_count
FROM `bigquery-public-data.stackoverflow.posts_questions`
WHERE tags like '%google-bigquery%'
ORDER BY view_count DESC
LIMIT 10

Establece la propiedad context.use_bqstorage_api en True para usar la API de almacenamiento de BigQuery de forma predeterminada.

import google.cloud.bigquery.magics

google.cloud.bigquery.magics.context.use_bqstorage_api = True

Después de establecer la propiedad context.use_bqstorage_api, ejecuta los comandos mágicos %%bigquery sin argumentos adicionales para usar la API de almacenamiento de BigQuery a fin de descargar resultados grandes.

%%bigquery java_deps
SELECT
    dependency_name,
    dependency_platform,
    project_name,
    project_id,
    version_number,
    version_id,
    dependency_kind,
    optional_dependency,
    dependency_requirements,
    dependency_project_id
FROM
    `bigquery-public-data.libraries_io.dependencies`
WHERE
    LOWER(dependency_platform) = 'maven'
LIMIT 2500000

Usa las bibliotecas cliente de Python

Crea clientes de Python

Usa el siguiente código para crear un objeto Client de BigQuery y un BigQueryStorageClient.

import google.auth
from google.cloud import bigquery
from google.cloud import bigquery_storage_v1beta1

# Explicitly create a credentials object. This allows you to use the same
# credentials for both the BigQuery and BigQuery Storage clients, avoiding
# unnecessary API calls to fetch duplicate authentication tokens.
credentials, your_project_id = google.auth.default(
    scopes=["https://www.googleapis.com/auth/cloud-platform"]
)

# Make clients.
bqclient = bigquery.Client(
    credentials=credentials,
    project=your_project_id,
)
bqstorageclient = bigquery_storage_v1beta1.BigQueryStorageClient(
    credentials=credentials
)

Usa la biblioteca de Python google-auth a fin de crear credenciales que tengan el alcance suficiente para ambas API. Pasa un objeto de credenciales a cada constructor con el fin de evitar que la autenticación se realice dos veces.

Descarga los resultados de las consultas con la biblioteca cliente de BigQuery

Ejecuta una consulta con el método query. Llama al método to_dataframe para esperar a que finalice la consulta y descarga los resultados mediante la API de almacenamiento de BigQuery.

# Download query results.
query_string = """
SELECT
CONCAT(
    'https://stackoverflow.com/questions/',
    CAST(id as STRING)) as url,
view_count
FROM `bigquery-public-data.stackoverflow.posts_questions`
WHERE tags like '%google-bigquery%'
ORDER BY view_count DESC
"""

dataframe = (
    bqclient.query(query_string)
    .result()
    .to_dataframe(bqstorage_client=bqstorageclient)
)
print(dataframe.head())

Descarga los datos de las tablas mediante la biblioteca cliente de BigQuery

Descarga todas las filas de una tabla con el método list_rows, que muestra un objeto RowIterator. Descarga las filas con la API de almacenamiento de BigQuery mediante una llamada al método to_dataframe con el argumento bqstorage_client.

# Download a table.
table = bigquery.TableReference.from_string(
    "bigquery-public-data.utility_us.country_code_iso"
)
rows = bqclient.list_rows(
    table,
    selected_fields=[
        bigquery.SchemaField("country_name", "STRING"),
        bigquery.SchemaField("fips_code", "STRING"),
    ],
)
dataframe = rows.to_dataframe(bqstorage_client=bqstorageclient)
print(dataframe.head())

Descarga los datos de las tablas mediante la biblioteca cliente de la API de almacenamiento de BigQuery

Usa la biblioteca cliente de la API de almacenamiento de BigQuery directamente para obtener un control detallado sobre los filtros y el paralelismo. Cuando solo se necesitan filtros de fila simples, se puede usar una sesión de lectura de la API de almacenamiento de BigQuery en lugar de una consulta.

Crea un objeto TableReference con la tabla que se debe leer. Crea un objeto TableReadOptions para seleccionar columnas o filtrar filas. Crea una sesión de lectura con el método create_read_session.

Si hay alguna transmisión en la sesión, comienza la lectura de filas desde ella con el método read_rows. Llama al método to_dataframe en el lector para escribir toda la transmisión en un DataFrame de Pandas. Para obtener un mejor rendimiento, se debe leer desde múltiples transmisiones en paralelo, aunque este ejemplo de código lee desde una transmisión única para simplificar.

table = bigquery_storage_v1beta1.types.TableReference()
table.project_id = "bigquery-public-data"
table.dataset_id = "new_york_trees"
table.table_id = "tree_species"

# Select columns to read with read options. If no read options are
# specified, the whole table is read.
read_options = bigquery_storage_v1beta1.types.TableReadOptions()
read_options.selected_fields.append("species_common_name")
read_options.selected_fields.append("fall_color")

parent = "projects/{}".format(your_project_id)
session = bqstorageclient.create_read_session(
    table,
    parent,
    read_options=read_options,
    # This API can also deliver data serialized in Apache Avro format.
    # This example leverages Apache Arrow.
    format_=bigquery_storage_v1beta1.enums.DataFormat.ARROW,
    # We use a LIQUID strategy in this example because we only read from a
    # single stream. Consider BALANCED if you're consuming multiple streams
    # concurrently and want more consistent stream sizes.
    sharding_strategy=(
        bigquery_storage_v1beta1.enums.ShardingStrategy.LIQUID
    ),
)

# This example reads from only a single stream. Read from multiple streams
# to fetch data faster. Note that the session may not contain any streams
# if there are no rows to read.
stream = session.streams[0]
position = bigquery_storage_v1beta1.types.StreamPosition(stream=stream)
reader = bqstorageclient.read_rows(position)

# Parse all Avro blocks and create a dataframe. This call requires a
# session, because the session contains the schema for the row blocks.
dataframe = reader.to_dataframe(session)
print(dataframe.head())

Código fuente de todos los ejemplos

Mira el código fuente completo de todos los ejemplos de biblioteca cliente.

import google.auth
from google.cloud import bigquery
from google.cloud import bigquery_storage_v1beta1

# Explicitly create a credentials object. This allows you to use the same
# credentials for both the BigQuery and BigQuery Storage clients, avoiding
# unnecessary API calls to fetch duplicate authentication tokens.
credentials, your_project_id = google.auth.default(
    scopes=["https://www.googleapis.com/auth/cloud-platform"]
)

# Make clients.
bqclient = bigquery.Client(
    credentials=credentials,
    project=your_project_id,
)
bqstorageclient = bigquery_storage_v1beta1.BigQueryStorageClient(
    credentials=credentials
)
# Download a table.
table = bigquery.TableReference.from_string(
    "bigquery-public-data.utility_us.country_code_iso"
)
rows = bqclient.list_rows(
    table,
    selected_fields=[
        bigquery.SchemaField("country_name", "STRING"),
        bigquery.SchemaField("fips_code", "STRING"),
    ],
)
dataframe = rows.to_dataframe(bqstorage_client=bqstorageclient)
print(dataframe.head())
# Download query results.
query_string = """
SELECT
CONCAT(
    'https://stackoverflow.com/questions/',
    CAST(id as STRING)) as url,
view_count
FROM `bigquery-public-data.stackoverflow.posts_questions`
WHERE tags like '%google-bigquery%'
ORDER BY view_count DESC
"""

dataframe = (
    bqclient.query(query_string)
    .result()
    .to_dataframe(bqstorage_client=bqstorageclient)
)
print(dataframe.head())
table = bigquery_storage_v1beta1.types.TableReference()
table.project_id = "bigquery-public-data"
table.dataset_id = "new_york_trees"
table.table_id = "tree_species"

# Select columns to read with read options. If no read options are
# specified, the whole table is read.
read_options = bigquery_storage_v1beta1.types.TableReadOptions()
read_options.selected_fields.append("species_common_name")
read_options.selected_fields.append("fall_color")

parent = "projects/{}".format(your_project_id)
session = bqstorageclient.create_read_session(
    table,
    parent,
    read_options=read_options,
    # This API can also deliver data serialized in Apache Avro format.
    # This example leverages Apache Arrow.
    format_=bigquery_storage_v1beta1.enums.DataFormat.ARROW,
    # We use a LIQUID strategy in this example because we only read from a
    # single stream. Consider BALANCED if you're consuming multiple streams
    # concurrently and want more consistent stream sizes.
    sharding_strategy=(
        bigquery_storage_v1beta1.enums.ShardingStrategy.LIQUID
    ),
)

# This example reads from only a single stream. Read from multiple streams
# to fetch data faster. Note that the session may not contain any streams
# if there are no rows to read.
stream = session.streams[0]
position = bigquery_storage_v1beta1.types.StreamPosition(stream=stream)
reader = bqstorageclient.read_rows(position)

# Parse all Avro blocks and create a dataframe. This call requires a
# session, because the session contains the schema for the row blocks.
dataframe = reader.to_dataframe(session)
print(dataframe.head())

Limpieza

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

Borra tu proyecto. No creaste ningún recurso de BigQuery en este instructivo, pero, si borras tu proyecto, se quitan todos los demás recursos que creaste.

  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.

Pasos siguientes

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

Enviar comentarios sobre...

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