Exemple : Application Python "Hello World"

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 Cloud Bigtable de la bibliothèque cliente Google Cloud pour Python afin de communiquer avec Cloud Bigtable. Le package Cloud Bigtable constitue le meilleur choix pour les nouvelles applications. Si vous devez déplacer une charge de travail HBase existante vers Cloud Bigtable, consultez l'exemple "Hello World" qui utilise le package HappyBase.

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

Utiliser la bibliothèque cliente Cloud 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

Utilisez PIP pour installer les packages Python requis dans un environnement virtualenv. L'exemple inclut un fichier de configuration qui définit les packages requis.

google-cloud-bigtable==1.5.1
google-cloud-core==1.4.3

Importez les modules.

import datetime

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

Se connecter à Cloud Bigtable

Connectez-vous à Cloud Bigtable à l'aide d'un objet 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)

Créer une table

Instanciez un objet de table à l'aide de Instance.table(). Créez ensuite une famille de colonnes, définissez sa stratégie de récupération de mémoire et transmettez cette famille à Table.create() pour créer la table.

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

Écrire des lignes dans une table

Parcourez une liste de chaînes de salutation pour créer des lignes de table. À chaque itération, utilisez Table.row() pour définir une ligne et attribuez-lui une clé de ligne. Appelez Row.set_cell() afin de définir une valeur pour la cellule actuellement sélectionnée, puis ajoutez la nouvelle ligne à un tableau de lignes. Enfin, appelez Table.mutate_rows() pour ajouter les lignes à la table.

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)

Créer un filtre

Avant de lire les données que vous avez écrites, créez un filtre à l'aide de row_filters.CellsColumnLimitFilter() afin de limiter les données renvoyées par Cloud Bigtable. Ce filtre indique à Cloud Bigtable de ne renvoyer que la version la plus récente de chaque valeur, même si la table contient des versions antérieures qui n'ont pas fait l'objet d'une récupération de mémoire.

row_filter = row_filters.CellsColumnLimitFilter(1)

Lire une ligne à l'aide de sa clé

Appelez la méthode Table.read_row() pour obtenir une référence à la ligne avec une clé de ligne spécifique, en indiquant la clé et le filtre, afin d'avoir une version de chaque valeur dans cette ligne.

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

Analyser toutes les lignes de la table

Utilisez Table.read_rows() pour lire une plage de lignes d'une table.

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

Supprimer une table

Supprimez une table à l'aide de Table.delete().

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

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