Exemple : Application Python "Hello World" via l'API HappyBase

Cet exemple présente une application très simple "Hello World", écrite en Python, et montre comment :

  • se connecter à une instance Cloud Bigtable ;
  • créer une table ;
  • Écrire des données dans une table
  • Relire les données
  • Supprimer la table

Exécuter l'exemple

Cet exemple utilise le package HappyBase de la bibliothèque cliente Google Cloud pour Python, une mise en œuvre des API HappyBase, afin de communiquer avec Cloud Bigtable. Le package HappyBase vous permet de déplacer une charge de travail HBase existante vers Cloud Bigtable. Pour les nouvelles applications, consultez l'exemple "Hello World" qui utilise le package Cloud Bigtable.

Pour exécuter ce programme, suivez les instructions de l'exemple sur GitHub.

Utiliser les API HappyBase avec Cloud Bigtable

L'exemple d'application permet de se connecter à Cloud Bigtable et décrit quelques opérations simples.

Installer et importer la bibliothèque cliente

Les packages Python requis peuvent être installés à l'aide de PIP dans un environnement virtualenv. L'exemple inclut un fichier de configuration qui définit les packages requis.

google-cloud-happybase==0.33.0

Les modules peuvent ensuite être importés.

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

Se connecter à Cloud Bigtable

Connectez-vous à Cloud Bigtable en transmettant un objet bigtable.Client à un objet 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)

Créer une table

Créez une table et ses familles de colonnes à l'aide de Connection.create_table().

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

Écrire des lignes dans une table

Obtenez une Table existante avec Connection.table(). Utilisez Table.put() pour écrire une ligne dans la table.

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

Lire une ligne à l'aide de sa clé

Obtenez une ligne directement en utilisant sa clé avec 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')]))

Analyser toutes les lignes d'une table

Utilisez Table.scan() pour obtenir une plage de lignes.

print('Scanning for all greetings:')

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

Supprimer une table

Supprimez une table à l'aide de Connection.delete_table().

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

Synthèse

Voici l'exemple complet sans commentaires.



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