Ejemplo: Aplicación "Hello World" en Python

En este ejemplo, se usa una aplicación muy simple llamada Hello World y escrita en Python, y se muestra cómo realizar las siguientes acciones:

  • Conectarse a una instancia de Cloud Bigtable.
  • Crear una tabla nueva.
  • Escribir datos en la tabla.
  • Volver a leer datos.
  • Borrar la tabla.

Ejecutar la muestra

En este ejemplo, se usa el paquete de Cloud Bigtable de la biblioteca cliente de Google Cloud para Python a fin de comunicarse con Cloud Bigtable. El paquete de Cloud Bigtable es la mejor opción para aplicaciones nuevas. Si necesitas transferir una carga de trabajo existente de HBase a Cloud 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.

Usar la biblioteca cliente de Cloud con Cloud Bigtable

La aplicación de muestra se conecta con Cloud Bigtable y demuestra algunas operaciones simples.

Instalar y, luego, importar la biblioteca cliente

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

google-cloud-bigtable==0.32.1
google-cloud-core==0.29.1

Importa los módulos.

import datetime

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

Conectarse con Cloud Bigtable

Conéctate a Cloud Bigtable con bigtable.Client.

# 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

Origina una instancia de un objeto de tabla con Instance.table(). Crea una familia de columnas y configura su política de recolección de elementos no utilizados, y 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() a fin de definir una fila y asignarle una clave de fila; llama a Row.set_cell() con el fin de configurar un valor para la celda actual; y anexa la fila nueva a un arreglo de filas. Por último, llama a Table.mutate_rows() para agregar las filas a la tabla.

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.row(row_key)
    row.set_cell(column_family_id,
                 column,
                 value,
                 timestamp=datetime.datetime.utcnow())
    rows.append(row)
table.mutate_rows(rows)

Crea un filtro

Antes de leer los datos que escribiste, crea un filtro mediante row_filters.CellsColumnLimitFilter() para limitar los datos que muestra Cloud Bigtable. El filtro le indica a Cloud Bigtable que muestre solo la versión más reciente de cada valor, incluso si la tabla contiene versiones anteriores que no han pasado por el proceso de recolección de elementos no utilizados.

row_filter = row_filters.CellsColumnLimitFilter(1)

Lee una fila por su clave

Llama al método api-bigtable-table-read-row de la tabla [Table.read_row()] para obtener una referencia con una clave de fila específica, pasando la clave y el filtro, a fin de obtener una versión de cada valor de esa fila.

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 una tabla

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

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

Borrar una tabla

Borra una tabla con Table.delete().

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

Revisión general

El ejemplo completo sin comentarios.


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

Prerequisites:

- Create a Cloud Bigtable cluster.
  https://cloud.google.com/bigtable/docs/creating-cluster
- 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('Creating the {} table.'.format(table_id))
    table = instance.table(table_id)

    print('Creating column family cf1 with Max Version GC rule...')
    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))

    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):
        row_key = 'greeting{}'.format(i).encode()
        row = table.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('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'))

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

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

if __name__ == '__main__':
    parser = argparse.ArgumentParser(
        description=__doc__,
        formatter_class=argparse.ArgumentDefaultsHelpFormatter)
    parser.add_argument('project_id', help='Your Cloud Platform project ID.')
    parser.add_argument(
        'instance_id', help='ID of the Cloud Bigtable instance to connect to.')
    parser.add_argument(
        '--table',
        help='Table to create and destroy.',
        default='Hello-Bigtable')

    args = parser.parse_args()
    main(args.project_id, args.instance_id, args.table)
¿Te sirvió esta página? Envíanos tu opinión:

Enviar comentarios sobre…

Documentación de Cloud Bigtable