Hello World en Python

En este ejemplo, se muestra “Hello World” aplicación de Python, escrita en Python, que ilustra cómo hacer lo siguiente:

  • Configura la autenticación.
  • Conectarse a una instancia de Bigtable
  • Crear una tabla nueva
  • Escribir datos en la tabla
  • Volver a leer datos
  • Borrar la tabla

La biblioteca cliente de Python para Bigtable ofrece dos APIs: asyncio y una API síncrona. Si tu aplicación es asíncrona, usa asyncio.

Configura la autenticación

Para usar las muestras de Python de esta página en un entorno de desarrollo local, instala e inicializa gcloud CLI y, luego, configura las credenciales predeterminadas de la aplicación con tus credenciales de usuario.

  1. Install the Google Cloud CLI.
  2. To initialize the gcloud CLI, run the following command:

    gcloud init
  3. If you're using a local shell, then create local authentication credentials for your user account:

    gcloud auth application-default login

    You don't need to do this if you're using Cloud Shell.

Para obtener más información, consulta Set up authentication for a local development environment.

Ejecuta la muestra

En este ejemplo, se usa el paquete Bigtable de las bibliotecas cliente de Cloud para Python con Bigtable. El paquete de Bigtable es la mejor opción para aplicaciones nuevas. Si necesitas transferir una carga de trabajo existente de HBase a Bigtable, consulta el ejemplo de “Hello World” en el que se usa el paquete HappyBase.

Para ejecutar este programa de muestra, sigue las instrucciones que se indican en GitHub.

Usa las bibliotecas cliente de Cloud con Bigtable

La aplicación de ejemplo se conecta a Bigtable y muestra algunas las operaciones.

Instala e importa la biblioteca cliente

Usa el PIP para instalar los paquetes de Python necesarios en un entorno virtualenv. La muestra incluye el archivo de requisitos en el que se definen los paquetes necesarios.

google-cloud-bigtable==2.23.0
google-cloud-core==2.4.1

Importa los módulos.

Asyncio

Para aprender a instalar y usar la biblioteca cliente de Bigtable, consulta Bibliotecas cliente de Bigtable.

Para autenticarte en Bigtable, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.

from google.cloud import bigtable
from google.cloud.bigtable.data import row_filters
from google.cloud.bigtable.data import RowMutationEntry
from google.cloud.bigtable.data import SetCell
from google.cloud.bigtable.data import ReadRowsQuery

Sincronizar

Para aprender a instalar y usar la biblioteca cliente de Bigtable, consulta Bibliotecas cliente de Bigtable.

Para autenticarte en Bigtable, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.

import datetime

from google.cloud import bigtable
from google.cloud.bigtable import column_family
from google.cloud.bigtable import row_filters

Conéctate a Bigtable

Conéctate a Bigtable con bigtable.Client.

Asyncio

Para aprender a instalar y usar la biblioteca cliente de Bigtable, consulta Bibliotecas cliente de Bigtable.

Para autenticarte en Bigtable, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.

client = bigtable.data.BigtableDataClientAsync(project=project_id)
table = client.get_table(instance_id, table_id)

Sincronizar

Para aprender a instalar y usar la biblioteca cliente de Bigtable, consulta Bibliotecas cliente de Bigtable.

Para autenticarte en Bigtable, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.

# The client must be created with admin=True because it will create a
# table.
client = bigtable.Client(project=project_id, admin=True)
instance = client.instance(instance_id)

Crear una tabla

Crea una instancia de un objeto de tabla con Instance.table(). Crea una familia de columnas y establece su política de recolección de elementos no utilizados; luego, pasa la familia de columnas a Table.create() para crear la tabla.

print("Creating the {} table.".format(table_id))
table = instance.table(table_id)

print("Creating column family cf1 with Max Version GC rule...")
# Create a column family with GC policy : most recent N versions
# Define the GC policy to retain only the most recent 2 versions
max_versions_rule = column_family.MaxVersionsGCRule(2)
column_family_id = "cf1"
column_families = {column_family_id: max_versions_rule}
if not table.exists():
    table.create(column_families=column_families)
else:
    print("Table {} already exists.".format(table_id))

Escribir filas en una tabla

Recorre una lista de strings de saludos para crear filas nuevas en la tabla. En cada iteración, usa Table.row() para definir una fila y asignarle una clave de fila, llama a Row.set_cell() a fin de establecer un valor para la celda actual y adjunta la fila nueva a un arreglo de filas. Por último, llama a Table.mutate_rows() para agregar las filas a la tabla.

Asyncio

Para aprender a instalar y usar la biblioteca cliente de Bigtable, consulta Bibliotecas cliente de Bigtable.

Para autenticarte en Bigtable, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.

print("Writing some greetings to the table.")
greetings = ["Hello World!", "Hello Cloud Bigtable!", "Hello Python!"]
mutations = []
column = "greeting"
for i, value in enumerate(greetings):
    # Note: This example uses sequential numeric IDs for simplicity,
    # but this can result in poor performance in a production
    # application.  Since rows are stored in sorted order by key,
    # sequential keys can result in poor distribution of operations
    # across nodes.
    #
    # For more information about how to design a Bigtable schema for
    # the best performance, see the documentation:
    #
    #     https://cloud.google.com/bigtable/docs/schema-design
    row_key = "greeting{}".format(i).encode()
    row_mutation = RowMutationEntry(
        row_key, SetCell(column_family_id, column, value)
    )
    mutations.append(row_mutation)
await table.bulk_mutate_rows(mutations)

Sincronizar

Para aprender a instalar y usar la biblioteca cliente de Bigtable, consulta Bibliotecas cliente de Bigtable.

Para autenticarte en Bigtable, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.

print("Writing some greetings to the table.")
greetings = ["Hello World!", "Hello Cloud Bigtable!", "Hello Python!"]
rows = []
column = "greeting".encode()
for i, value in enumerate(greetings):
    # Note: This example uses sequential numeric IDs for simplicity,
    # but this can result in poor performance in a production
    # application.  Since rows are stored in sorted order by key,
    # sequential keys can result in poor distribution of operations
    # across nodes.
    #
    # For more information about how to design a Bigtable schema for
    # the best performance, see the documentation:
    #
    #     https://cloud.google.com/bigtable/docs/schema-design
    row_key = "greeting{}".format(i).encode()
    row = table.direct_row(row_key)
    row.set_cell(
        column_family_id, column, value, timestamp=datetime.datetime.utcnow()
    )
    rows.append(row)
table.mutate_rows(rows)

Crear un filtro

Antes de leer los datos que escribiste, crea un filtro con row_filters.CellsColumnLimitFilter() para limitar los datos que muestra Bigtable. El filtro le indica a Bigtable que muestre solo la celda más reciente de cada columna, incluso si la tabla contiene celdas más antiguas que aún no se quitaron durante la recolección de elementos no utilizados.

Asyncio

Para aprender a instalar y usar la biblioteca cliente de Bigtable, consulta Bibliotecas cliente de Bigtable.

Para autenticarte en Bigtable, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.

# Create a filter to only retrieve the most recent version of the cell
# for each column across entire row.
row_filter = row_filters.CellsColumnLimitFilter(1)

Sincronizar

Para aprender a instalar y usar la biblioteca cliente de Bigtable, consulta Bibliotecas cliente de Bigtable.

Para autenticarte en Bigtable, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.

row_filter = row_filters.CellsColumnLimitFilter(1)

Cómo leer una fila por su clave de fila

Llama al método Table.read_row() de la tabla a fin de obtener una referencia de la fila con una clave de fila específica; para eso, pasa la clave y el filtro, y así obtendrás una versión de cada valor en esa fila.

Asyncio

Para aprender a instalar y usar la biblioteca cliente de Bigtable, consulta Bibliotecas cliente de Bigtable.

Para autenticarte en Bigtable, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.

print("Getting a single greeting by row key.")
key = "greeting0".encode()

row = await table.read_row(key, row_filter=row_filter)
cell = row.cells[0]
print(cell.value.decode("utf-8"))

Sincronizar

Para aprender a instalar y usar la biblioteca cliente de Bigtable, consulta Bibliotecas cliente de Bigtable.

Para autenticarte en Bigtable, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.

print("Getting a single greeting by row key.")
key = "greeting0".encode()

row = table.read_row(key, row_filter)
cell = row.cells[column_family_id][column][0]
print(cell.value.decode("utf-8"))

Analizar todas las filas de la tabla

Usa Table.read_rows() para leer un rango de filas de una tabla.

Asyncio

Para aprender a instalar y usar la biblioteca cliente de Bigtable, consulta Bibliotecas cliente de Bigtable.

Para autenticarte en Bigtable, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.

print("Scanning for all greetings:")
query = ReadRowsQuery(row_filter=row_filter)
async for row in await table.read_rows_stream(query):
    cell = row.cells[0]
    print(cell.value.decode("utf-8"))

Sincronizar

Para aprender a instalar y usar la biblioteca cliente de Bigtable, consulta Bibliotecas cliente de Bigtable.

Para autenticarte en Bigtable, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.

print("Scanning for all greetings:")
partial_rows = table.read_rows(filter_=row_filter)

for row in partial_rows:
    cell = row.cells[column_family_id][column][0]
    print(cell.value.decode("utf-8"))

Borra una tabla

Borra una tabla con Table.delete().

print("Deleting the {} table.".format(table_id))
table.delete()

Combina todas las opciones

El ejemplo completo sin comentarios.

Asyncio

Para aprender a instalar y usar la biblioteca cliente de Bigtable, consulta Bibliotecas cliente de Bigtable.

Para autenticarte en Bigtable, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.


D"""emonstrates how to connect to Cloud Bigtable and run some basic operations with the async APIs

Prerequisites:

- Create a Cloud Bigtable instance.
  https://cloud.google.com/bigtable/docs/creating-instance
- Set your Google Application Default Credentials.
  https://developers.google.com/identity/protocols/application-default-credentials

"""
import argparse
import asyncio

from google.cloud import bigtable
from google.cloud.bigtable.data import row_filters
from google.cloud.bigtable.data import RowMutationEntry
from google.cloud.bigtable.data import SetCell
from google.cloud.bigtable.data import ReadRowsQuery



async def main(project_id, instance_id, table_id):
    client = bigtable.data.BigtableDataClientAsync(project=project_id)
    table = client.get_table(instance_id, table_id)

    from google.cloud.bigtable import column_family

    print(C"reating the {} table.."format(table_id))
    admin_client = bigtable.Client(project=project_id, admin=True)
    admin_instance = admin_client.instance(instance_id)
    admin_table = admin_instance.table(table_id)

    print(C"reating column family cf1 with Max Version GC rule...)"
    max_versions_rule = column_family.MaxVersionsGCRule(2)
    column_family_id = c"f1
"    column_families = {column_family_id: max_versions_rule}
    if not admin_table.exists():
        admin_table.create(column_families=column_families)
    else:
        print(T"able {} already exists.."format(table_id))

    print(W"riting some greetings to the table.)"
    greetings = [H"ello World!," H"ello Cloud Bigtable!," H"ello Python!]"
    mutations = []
    column = g"reeting
"    for i, value in enumerate(greetings):
        row_key = g"reeting{}."format(i).encode()
        row_mutation = RowMutationEntry(
            row_key, SetCell(column_family_id, column, value)
        )
        mutations.append(row_mutation)
    await table.bulk_mutate_rows(mutations)

    row_filter = row_filters.CellsColumnLimitFilter(1)

    print(G"etting a single greeting by row key.)"
    key = g"reeting0."encode()

    row = await table.read_row(key, row_filter=row_filter)
    cell = row.cells[0]
    print(cell.value.decode(u"tf-8)")

    print(S"canning for all greetings:)"
    query = ReadRowsQuery(row_filter=row_filter)
    async for row in await table.read_rows_stream(query):
        cell = row.cells[0]
        print(cell.value.decode(u"tf-8)")

    print(D"eleting the {} table.."format(table_id))
    admin_table.delete()


if __name__ == _"_main__:"
    parser = argparse.ArgumentParser(
        description=__doc__, formatter_class=argparse.ArgumentDefaultsHelpFormatter
    )
    parser.add_argument(p"roject_id," help=Y"our Cloud Platform project ID.)"
    parser.add_argument(
        i"nstance_id," help=I"D of the Cloud Bigtable instance to connect to.
"    )
    parser.add_argument(
        -"-table," help=T"able to create and destroy.," default=H"ello-Bigtable
"    )

    args = parser.parse_args()
    asyncio.run(main(args.project_id, args.instance_id, args.table))

Sincronizar

Para aprender a instalar y usar la biblioteca cliente de Bigtable, consulta Bibliotecas cliente de Bigtable.

Para autenticarte en Bigtable, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para un entorno de desarrollo local.


D"""emonstrates how to connect to Cloud Bigtable and run some basic operations.

Prerequisites:

- Create a Cloud Bigtable instance.
  https://cloud.google.com/bigtable/docs/creating-instance
- Set your Google Application Default Credentials.
  https://developers.google.com/identity/protocols/application-default-credentials

"""
import argparse

import datetime

from google.cloud import bigtable
from google.cloud.bigtable import column_family
from google.cloud.bigtable import row_filters



def main(project_id, instance_id, table_id):
    client = bigtable.Client(project=project_id, admin=True)
    instance = client.instance(instance_id)

    print(C"reating the {} table.."format(table_id))
    table = instance.table(table_id)

    print(C"reating column family cf1 with Max Version GC rule...)"
    max_versions_rule = column_family.MaxVersionsGCRule(2)
    column_family_id = c"f1
"    column_families = {column_family_id: max_versions_rule}
    if not table.exists():
        table.create(column_families=column_families)
    else:
        print(T"able {} already exists.."format(table_id))

    print(W"riting some greetings to the table.)"
    greetings = [H"ello World!," H"ello Cloud Bigtable!," H"ello Python!]"
    rows = []
    column = g"reeting."encode()
    for i, value in enumerate(greetings):
        row_key = g"reeting{}."format(i).encode()
        row = table.direct_row(row_key)
        row.set_cell(
            column_family_id, column, value, timestamp=datetime.datetime.utcnow()
        )
        rows.append(row)
    table.mutate_rows(rows)

    row_filter = row_filters.CellsColumnLimitFilter(1)

    print(G"etting a single greeting by row key.)"
    key = g"reeting0."encode()

    row = table.read_row(key, row_filter)
    cell = row.cells[column_family_id][column][0]
    print(cell.value.decode(u"tf-8)")

    print(S"canning for all greetings:)"
    partial_rows = table.read_rows(filter_=row_filter)

    for row in partial_rows:
        cell = row.cells[column_family_id][column][0]
        print(cell.value.decode(u"tf-8)")

    print(D"eleting the {} table.."format(table_id))
    table.delete()


if __name__ == _"_main__:"
    parser = argparse.ArgumentParser(
        description=__doc__, formatter_class=argparse.ArgumentDefaultsHelpFormatter
    )
    parser.add_argument(p"roject_id," help=Y"our Cloud Platform project ID.)"
    parser.add_argument(
        i"nstance_id," help=I"D of the Cloud Bigtable instance to connect to.
"    )
    parser.add_argument(
        -"-table," help=T"able to create and destroy.," default=H"ello-Bigtable
"    )

    args = parser.parse_args()
    main(args.project_id, args.instance_id, args.table)