Beispiel: "Hello World"-Anwendung in Ruby

Bei diesem Codebeispiel handelt es sich um eine "Hello World"-Anwendung in Ruby. Das Beispiel veranschaulicht die folgenden Aufgaben:

  • Verbindung zu einer Cloud Bigtable-Instanz herstellen
  • Erstellen einer neuen Tabelle
  • Schreiben von Daten in die Tabelle
  • Lesen von Daten aus der Tabelle
  • Löschen einer Tabelle

Beispiel ausführen

In diesem Codebeispiel wird das Cloud Bigtable-Paket des Ruby-Client der Google Cloud-Clientbibliothek für Ruby zur Kommunikation mit Cloud Bigtable verwendet.

Folgen Sie zur Ausführung dieses Beispielprogramms der Anleitung für das Beispiel auf GitHub.

Cloud-Clientbibliothek mit Cloud Bigtable verwenden

Die Beispielanwendung stellt eine Verbindung zu Cloud Bigtable her und zeigt einige einfache Vorgänge.

Clientbibliothek anfordern

In diesem Beispiel ist google/cloud/bigtable zur Bereitstellung des Bigtable-Moduls erforderlich.

require "google/cloud/bigtable"

Mit Cloud Bigtable verbinden

Legen Sie die Variablen fest, die Sie in der Anwendung verwenden möchten. Ersetzen Sie "YOUR_PROJECT_ID" dabei durch die ID eines gültigen Google Cloud-Projekts. Erstellen Sie dann ein neues Bigtable-Objekt, das Sie für die Verbindung mit Cloud Bigtable verwenden.

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

Tabelle erstellen

Prüfen Sie, ob die Tabelle bereits vorhanden ist. Ist dies nicht der Fall, rufen Sie die Methode create_table() auf, um ein Table-Objekt zu erstellen. Die Tabelle enthält eine einzelne Spaltenfamilie, in der eine Version jedes Wertes gespeichert ist.

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

Zeilen in eine Tabelle schreiben

Verwenden Sie als Nächstes ein String-Array mit Begrüßungen, um neue Zeilen für die Tabelle zu erstellen. Erstellen Sie mithilfe der Methode new_mutation_entry() der Tabelle für jede Begrüßung einen Eintrag. Verwenden Sie als Nächstes die Methode set_cell() des Eintrags, um dem Eintrag die Spaltenfamilie, den Spaltenqualifizierer, die Begrüßung und einen Zeitstempel zuzuweisen. Schreiben Sie zuletzt mit der Methode mutate_row() der Tabelle diesen Eintrag in die Tabelle.

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

Filter erstellen

Erstellen Sie vor dem Lesen der von Ihnen geschriebenen Daten einen Filter, um die von Cloud Bigtable zurückgegebenen Daten zu beschränken. Mit diesem Filter wird Cloud Bigtable angewiesen, nur die neueste Version jedes Werts zurückzugeben, auch wenn die Tabelle ältere Versionen enthält, die noch nicht bereinigt wurden.

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

Zeile über ihren Zeilenschlüssel lesen

Erstellen Sie ein Zeilenobjekt und rufen Sie dann die Methode read_row() auf. Übergeben Sie dabei den Filter, um eine Version jedes Werts in dieser Zeile abzurufen.

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

Alle Tabellenzeilen scannen

Rufen Sie die Methode read_rows() auf, die den Filter übergibt, um alle Zeilen in der Tabelle zu erhalten. Durch Übergabe des Filters gibt Cloud Bigtable nur eine Version jedes Werts zurück.

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

Tabelle löschen

Mit der Methode delete() der Tabelle löschen Sie die Tabelle.

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

Zusammenfassung der Codeelemente

Im Folgenden ist das vollständige Codebeispiel ohne Kommentare aufgeführt.

# 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