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.

# instance_id      = "my-instance"
# table_id         = "my-table"
# column_family    = "cf"
# column_qualifier = "greeting"

bigtable = Google::Cloud::Bigtable.new

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

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.

# Copyright 2020 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

def hello_world instance_id, table_id, column_family, column_qualifier
  require "google/cloud/bigtable"

  # instance_id      = "my-instance"
  # table_id         = "my-table"
  # column_family    = "cf"
  # column_qualifier = "greeting"

  bigtable = Google::Cloud::Bigtable.new

  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
end