Ejemplo: Aplicación de “Hello World” de Python a través de la API de HappyBase

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

Ejecuta la muestra

En este ejemplo, se usa el paquete de HappyBase de la biblioteca cliente de Google Cloud para Python, una implementación de las API de HappyBase, a fin de comunicarse con Bigtable. Usa el paquete de HappyBase si necesitas transferir una carga de trabajo existente de HBase a Bigtable. En el caso de aplicaciones nuevas, consulta el ejemplo de “Hello World” que usa el paquete de Cloud Bigtable.

Para ejecutar este programa de muestra, sigue las instrucciones de la muestra en GitHub.

Usa las API de HappyBase con Bigtable

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

Cómo instalar e importar la biblioteca cliente

Los paquetes de Python obligatorios se pueden instalar con PIP en un entorno virtualenv. La muestra incluye el archivo de requisitos en el que se definen los paquetes necesarios.

google-cloud-happybase==0.33.0

Los módulos pueden ser importados.

from google.cloud import bigtable
from google.cloud import happybase

Conéctate a Bigtable

Conéctate a Bigtable mediante el pasaje de un bigtable.Client a un happybase.Connection.

# 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)
connection = happybase.Connection(instance=instance)

Crea una tabla

Usa Connection.create_table() para crear una tabla y sus familias de columnas.

print('Creating the {} table.'.format(table_name))
column_family_name = 'cf1'
connection.create_table(
    table_name,
    {
        column_family_name: dict()  # Use default options.
    })

Escribe filas en una tabla

Obtén un Table existente con Connection.table(). Usa Table.put() para escribir una fila en la tabla.

print('Writing some greetings to the table.')
table = connection.table(table_name)
column_name = '{fam}:greeting'.format(fam=column_family_name)
greetings = [
    'Hello World!',
    'Hello Cloud Bigtable!',
    'Hello HappyBase!',
]

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)
    table.put(
        row_key, {column_name.encode('utf-8'): value.encode('utf-8')}
    )

Lee una fila por su clave

Obtén una fila directamente con su clave con Table.row().

print('Getting a single greeting by row key.')
key = 'greeting0'.encode('utf-8')
row = table.row(key)
print('\t{}: {}'.format(key, row[column_name.encode('utf-8')]))

Analiza todas las filas de una tabla

Usa Table.scan() para obtener un rango de filas.

print('Scanning for all greetings:')

for key, row in table.scan():
    print('\t{}: {}'.format(key, row[column_name.encode('utf-8')]))

Borra una tabla

Borra una tabla con Connection.delete_table().

print('Deleting the {} table.'.format(table_name))
connection.delete_table(table_name)

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

from google.cloud import bigtable
from google.cloud import happybase

def main(project_id, instance_id, table_name):
    client = bigtable.Client(project=project_id, admin=True)
    instance = client.instance(instance_id)
    connection = happybase.Connection(instance=instance)

    try:
        print('Creating the {} table.'.format(table_name))
        column_family_name = 'cf1'
        connection.create_table(
            table_name,
            {
                column_family_name: dict()  # Use default options.
            })

        print('Writing some greetings to the table.')
        table = connection.table(table_name)
        column_name = '{fam}:greeting'.format(fam=column_family_name)
        greetings = [
            'Hello World!',
            'Hello Cloud Bigtable!',
            'Hello HappyBase!',
        ]

        for i, value in enumerate(greetings):
            row_key = 'greeting{}'.format(i)
            table.put(
                row_key, {column_name.encode('utf-8'): value.encode('utf-8')}
            )

        print('Getting a single greeting by row key.')
        key = 'greeting0'.encode('utf-8')
        row = table.row(key)
        print('\t{}: {}'.format(key, row[column_name.encode('utf-8')]))

        print('Scanning for all greetings:')

        for key, row in table.scan():
            print('\t{}: {}'.format(key, row[column_name.encode('utf-8')]))

        print('Deleting the {} table.'.format(table_name))
        connection.delete_table(table_name)

    finally:
        connection.close()

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)