Exemple : Application "Hello World" en Ruby

Cet exemple de code présente une application "Hello World" écrite en Ruby. Il montre comment effectuer les tâches suivantes :

  • 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 Ruby Client for Cloud Bigtable de la bibliothèque cliente Google Cloud pour Ruby afin de communiquer avec Cloud Bigtable.

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.

Bibliothèque cliente requise

L'exemple nécessite google/cloud/bigtable, qui fournit le module Bigtable.

require "google/cloud/bigtable"

Se connecter à Cloud Bigtable

Définissez les variables que vous utiliserez au sein de votre application, en remplaçant "YOUR_PROJECT_ID" par l'ID d'un projet Google Cloud valide. Créez ensuite un objet Bigtable qui vous servira à vous connecter à Cloud Bigtable.

project_id = "YOUR_PROJECT_ID"
table_id = "Hello-Bigtable"
instance_id = "my-instance"
column_family = "cf"
column_qualifier = "greeting"

bigtable = Google::Cloud::Bigtable.new project_id: project_id

Créer une table

Vérifiez si votre table existe déjà. Si ce n'est pas le cas, appelez la méthode create_table() pour créer un objet Table. La table possède une seule famille de colonnes qui conserve une version de chaque valeur.

if bigtable.table(instance_id, table_id).exists?
  puts "#{table_id} is already exists."
  exit 0
else
  table = bigtable.create_table instance_id, table_id do |column_families|
    column_families.add(
      column_family,
      Google::Cloud::Bigtable::GcRule.max_versions(1)
    )
  end

  puts "Table #{table_id} created."
end

Écrire des lignes dans une table

Ensuite, utilisez un tableau de chaînes de salutations pour créer des lignes de table. Pour chaque salutation, créez une entrée à l'aide de la méthode new_mutation_entry() de la table. Ensuite, utilisez la méthode set_cell() de l'entrée pour lui attribuer la famille de colonnes, le qualificatif de colonne, le message de salutation ainsi qu'un horodatage. Enfin, écrivez cette entrée dans la table à l'aide de la méthode mutate_row() de la table.

puts "Write some greetings to the table #{table_id}"
greetings = ["Hello World!", "Hello Bigtable!", "Hello Ruby!"]

# Insert rows one by one
# Note: To perform multiple mutation on multiple rows use `mutate_rows`.
greetings.each_with_index do |value, i|
  puts " Writing,  Row key: greeting#{i}, Value: #{value}"

  entry = table.new_mutation_entry "greeting#{i}"
  entry.set_cell(
    column_family,
    column_qualifier,
    value,
    timestamp: (Time.now.to_f * 1_000_000).round(-3)
  )

  table.mutate_row entry
end

Créer un filtre

Avant de lire les données que vous avez écrites, créez un filtre pour 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.

# Only retrieve the most recent version of the cell.
filter = Google::Cloud::Bigtable::RowFilter.cells_per_column 1

Lire une ligne à l'aide de sa clé

Créez un objet ligne, puis appelez la méthode read_row() en transmettant le filtre, afin d'obtenir une version pour chaque valeur de cette ligne.

puts "Reading a single row by row key"
row = table.read_row "greeting0", filter: filter
puts "Row key: #{row.key}, Value: #{row.cells[column_family].first.value}"

Analyser toutes les lignes de la table

Appelez la méthode read_rows() en transmettant le filtre, afin d'obtenir toutes les lignes de la table. En raison du filtre, Cloud Bigtable ne renvoie qu'une version de chaque valeur.

puts "Reading the entire table"
table.read_rows.each do |row|
  puts "Row key: #{row.key}, Value: #{row.cells[column_family].first.value}"
end

Supprimer une table

Supprimez la table à l'aide de sa méthode delete().

puts "Deleting the table #{table_id}"
table.delete

Synthèse

Voici l'exemple de code complet sans commentaires.

# frozen_string_literal: true

require "google/cloud/bigtable"

project_id = "YOUR_PROJECT_ID"
table_id = "Hello-Bigtable"
instance_id = "my-instance"
column_family = "cf"
column_qualifier = "greeting"

bigtable = Google::Cloud::Bigtable.new project_id: project_id

if bigtable.table(instance_id, table_id).exists?
  puts "#{table_id} is already exists."
  exit 0
else
  table = bigtable.create_table instance_id, table_id do |column_families|
    column_families.add(
      column_family,
      Google::Cloud::Bigtable::GcRule.max_versions(1)
    )
  end

  puts "Table #{table_id} created."
end

puts "Write some greetings to the table #{table_id}"
greetings = ["Hello World!", "Hello Bigtable!", "Hello Ruby!"]

# Insert rows one by one
# Note: To perform multiple mutation on multiple rows use `mutate_rows`.
greetings.each_with_index do |value, i|
  puts " Writing,  Row key: greeting#{i}, Value: #{value}"

  entry = table.new_mutation_entry "greeting#{i}"
  entry.set_cell(
    column_family,
    column_qualifier,
    value,
    timestamp: (Time.now.to_f * 1_000_000).round(-3)
  )

  table.mutate_row entry
end

# Only retrieve the most recent version of the cell.
filter = Google::Cloud::Bigtable::RowFilter.cells_per_column 1

puts "Reading a single row by row key"
row = table.read_row "greeting0", filter: filter
puts "Row key: #{row.key}, Value: #{row.cells[column_family].first.value}"

puts "Reading the entire table"
table.read_rows.each do |row|
  puts "Row key: #{row.key}, Value: #{row.cells[column_family].first.value}"
end

puts "Deleting the table #{table_id}"
table.delete