Mantenha tudo organizado com as coleções Salve e categorize o conteúdo com base nas suas preferências.

Hello World em Python

Este exemplo é um aplicativo "Hello World" muito simples, escrito em Python, que ilustra como:

  • conectar-se a uma instância do Cloud Bigtable;
  • Criação de uma nova tabela
  • Gravação de dados na tabela
  • Leitura dos dados
  • Exclusão da tabela

Como executar a amostra

Neste exemplo, mostramos o uso do pacote do Cloud Bigtable da biblioteca de cliente do Google Cloud para Python para se comunicar com o Bigtable. O pacote do Bigtable é a melhor opção para novos aplicativos. Se você precisar mover uma carga de trabalho atual do HBase para o Bigtable, veja o exemplo "Hello World" que usa o pacote do HappyBase.

Para executar este programa de amostra, siga as instruções do exemplo no GitHub.

Como usar a biblioteca de cliente do Cloud com o Bigtable

O aplicativo de amostra conecta-se ao Bigtable e demonstra algumas operações simples.

Como instalar e importar a biblioteca de cliente

Use o PIP para instalar os pacotes em Python, necessários em um ambiente virtualenv. A amostra inclui um arquivo de requisitos que define os pacotes necessários.

google-cloud-bigtable==2.15.0
google-cloud-core==2.3.2

Importe os módulos.

import datetime

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

Como se conectar ao Bigtable

Conecte-se ao Bigtable usando um 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)

Como criar uma tabela

Instancie um objeto de tabela usando Instance.table(). Crie um grupo de colunas e defina a política de coleta de lixo dele. Em seguida, passe o grupo de colunas para Table.create() a fim de criar a tabela.

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

Como gravar linhas em uma tabela

Execute um loop em uma lista de strings de saudação para criar algumas linhas novas na tabela. Em cada iteração, use Table.row() para definir uma linha e atribuir a ela uma chave de linha. Chame Row.set_cell() para definir o valor da célula atual e anexe a nova linha a uma matriz. Por fim, chame Table.mutate_rows() para adicionar as linhas à tabela.

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)

Como criar um filtro

Antes de ler os dados gravados, crie um filtro usando row_filters.CellsColumnLimitFilter() para limitar os dados retornados pelo Bigtable. Com esse filtro, o Bigtable retornará apenas a célula mais recente em cada coluna, mesmo que a tabela contenha células mais antigas que ainda não foram removidas durante a coleta de lixo.

row_filter = row_filters.CellsColumnLimitFilter(1)

Como ler uma linha pela respectiva chave

Chame o método Table.read_row() da tabela para receber uma referência da linha com uma chave de linha específica, transmitindo-a chave e o filtro, a fim de receber uma versão de cada valor naquela linha.

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

Como verificar todas as linhas da tabela

Use Table.read_rows() para ler um intervalo de linhas de uma tabela.

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

Como excluir tabelas

Exclua uma tabela com Table.delete().

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

Funcionamento em conjunto

Aqui está o exemplo completo sem comentários.



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