Cloud Bigtable-Daten abfragen

Auf dieser Seite wird gezeigt, wie Sie mit BigQuery Daten abfragen, die in Cloud Bigtable gespeichert sind.

Cloud Bigtable ist die dünnbesetzte NoSQL-Datenbank von Google, die auf Milliarden von Zeilen, Tausenden von Spalten und Petabyte an Daten skaliert werden kann. Cloud Bigtable nutzt ein Datenmodell, das Apache HBase ähnelt, und bietet eine mit HBase kompatible Clientbibliothek. Weitere Informationen zum Datenmodell von Cloud Bigtable finden Sie unter Cloud Bigtable-Speicherungsmodell.

Unterstützte Regionen und Zonen

Die Datenabfrage in Cloud Bigtable ist derzeit nur in folgenden Regionen und Zonen verfügbar:
Region Zone(n)
us-central1

us-central1-a

us-central1-b

us-central1-c

us-central1-f

europe-west1

europe-west1-b

europe-west1-c

europe-west1-d

Cloud Bigtable-URI abrufen

Sie müssen den Cloud Bigtable-URI angeben, um eine externe Tabelle für eine Cloud Bigtable-Datenquelle zu erstellen. So rufen Sie den Cloud Bigtable-URI ab:

  1. Öffnen Sie die Cloud Bigtable-Konsole.

    Zur Cloud Bigtable-Konsole

  2. Rufen Sie die folgenden Details über Ihre Cloud Bigtable-Datenquelle ab:

    • Ihre Projekt-ID
    • Ihre Cloud Bigtable-Instanz-ID
    • Den Namen Ihrer Cloud Bigtable-Tabelle
  3. Kombinieren Sie den Cloud Bigtable-URI im folgenden Format. Dabei gilt:

    • project_id ist das Projekt, das Ihre Cloud Bigtable-Instanz enthält.
    • instance_id ist die Cloud Bigtable-Instanz-ID.
    • table_name ist der Name der abzufragenden Tabelle.

    https://googleapis.com/bigtable/projects/project_id/instances/instance_id/tables/table_name

Zugriffssteuerung und Bereiche

Zugriffssteuerung für permanente externe Tabellen

Sie können den Zugriff auf eine permanente externe Tabelle freigeben, die mit einer Cloud Bigtable-Datenquelle verknüpft ist. Nicht freigeben können Sie hingegen den Zugriff auf eine temporäre externe Tabelle.

Sie haben die Möglichkeit, den Zugriff auf eine permanente externe Tabelle für Nutzer bzw. Dienstkonten oder Gruppen freizugeben. Zum Abfragen der externen Tabelle benötigen Ihre Nutzer oder Gruppen mindestens die folgenden Rollen:

  • Die Rolle bigquery.dataViewer auf Dataset-Ebene oder höher für den Zugriff auf das Dataset, das die externe Tabelle enthält
  • Die Rolle bigquery.user auf Projektebene oder höher, um Abfragejobs auszuführen
  • Die Rolle bigtable.reader in Cloud Bigtable, die schreibgeschützten Zugriff auf Metadaten und Tabellen bietet

Bereiche für Compute Engine-Instanzen

Wenn Sie eine Compute Engine-Instanz erstellen, können Sie eine Liste der Bereiche für die Instanz festlegen. Mit den Bereichen steuern Sie den Zugriff der Instanz auf Google Cloud-Produkte wie Cloud Bigtable. Auf der VM ausgeführte Anwendungen rufen Google Cloud APIs über das Dienstkonto auf.

Wenn Sie eine Compute Engine-Instanz einrichten, die als Dienstkonto ausgeführt werden soll, und das Dienstkonto auf eine externe Tabelle zugreift, die mit einer Cloud Bigtable-Datenquelle verknüpft ist, müssen Sie der Instanz den schreibgeschützten Datenzugriffsbereich (https://www.googleapis.com/auth/bigtable.data.readonly) von Cloud Bigtable hinzufügen. Weitere Informationen finden Sie unter Compute Engine-Instanz für Cloud Bigtable erstellen.

Wie Sie Bereiche auf eine Compute Engine-Instanz anwenden, erfahren Sie unter Dienstkonto und Zugriffsbereiche für eine Instanz ändern. Weitere Informationen zu Compute Engine-Dienstkonten finden Sie unter Dienstkonten.

Permanente und temporäre externe Tabellen

Sie können eine externe Datenquelle in BigQuery mithilfe einer permanenten Tabelle oder einer temporären Tabelle abfragen. Eine permanente Tabelle ist eine Tabelle, die in einem Dataset erstellt und mit Ihrer externen Datenquelle verknüpft wird. Da die Tabelle permanent ist, können Sie sie mithilfe von Zugriffssteuerungen für andere Nutzer freigeben, die ebenfalls Zugriff auf die zugrunde liegende externe Datenquelle haben. Außerdem können Sie die Tabelle jederzeit abfragen.

Wenn Sie eine externe Datenquelle mithilfe einer temporären Tabelle abfragen, senden Sie einen Befehl, der eine Abfrage enthält und durch den eine nicht permanente, mit der externen Datenquelle verknüpfte Tabelle erstellt wird. Wenn Sie eine temporäre Tabelle verwenden, erstellen Sie keine Tabelle in einem Ihrer BigQuery-Datasets. Da die Tabelle nicht permanent in einem Dataset gespeichert wird, kann sie nicht für andere Nutzer freigegeben werden. Das Abfragen einer externen Datenquelle mithilfe einer temporären Tabelle eignet sich für einmalige Ad-hoc-Abfragen von externen Daten sowie für ETL-Vorgänge (Extraktion, Transformation, Laden).

Cloud Bigtable-Daten mithilfe permanenter externer Tabellen abfragen

Wenn Sie eine Datenquelle mithilfe einer permanenten Tabelle abfragen möchten, erstellen Sie eine Tabelle in einem BigQuery-Dataset, die mit Ihrer Cloud Bigtable-Datenquelle verknüpft ist. Die Daten werden nicht in der BigQuery-Tabelle gespeichert. Da die Tabelle permanent ist, können Sie sie mithilfe von Zugriffssteuerungen auf Dataset-Ebene für andere Nutzer freigeben, die ebenfalls Zugriff auf die zugrunde liegende Cloud Bigtable-Datenquelle haben.

Wenn Sie in BigQuery eine permanente externe Tabelle erstellen, die mit einer Cloud Bigtable-Datenquelle verknüpft ist, gibt es zwei Möglichkeiten, um das Tabellenschema anzugeben:

  • Wenn Sie die API oder das bq-Befehlszeilentool verwenden, erstellen Sie eine Tabellendefinitionsdatei, in der Sie das Schema und die Metadaten der externen Datenquelle definieren.
  • Wenn Sie die Cloud Console oder die klassische BigQuery-Web-UI verwenden, geben Sie die Cloud Bigtable-Spaltenfamilie und die Qualifizierer manuell ein.

Zum Abfragen von Cloud Bigtable-Daten mithilfe einer permanenten externen Tabelle führen Sie die folgenden Schritte aus:

  • Erstellen Sie eine Tabellendefinitionsdatei (für die API oder das bq-Befehlszeilentool).
  • Erstellen Sie eine Tabelle in BigQuery, die mit der externen Datenquelle verknüpft ist.
  • Fragen Sie Daten mit der permanenten Tabelle ab.

Permanente externe Tabelle erstellen und abfragen

So erstellen Sie eine permanente Tabelle und fragen diese ab:

Console

Derzeit ist es mithilfe der Cloud Console nicht möglich, Daten aus Cloud Bigtable abzufragen.

Klassische UI

  1. Rufen Sie die BigQuery-Web-UI auf.
    Zur BigQuery-Web-UI

  2. Bewegen Sie den Mauszeiger im Navigationsbereich auf ein Dataset, klicken Sie auf den Abwärtspfeil Abwärtspfeilsymbol und dann auf Create new table (Neue Tabelle erstellen).

  3. Gehen Sie auf der Seite Tabelle erstellen im Abschnitt Quelldaten so vor:

    • Wählen Sie für Standort die Option Google Cloud Bigtable aus und geben Sie im Quellfeld den Cloud Bigtable-URI im folgenden Format ein: https://googleapis.com/bigtable/projects/project_id/instances/instance_id/tables/table_name. Dabei bezieht sich project_id auf das Projekt, das Ihre Cloud Bigtable-Instanz enthält. instance_id ist die ID der Cloud Bigtable-Instanz und table_name der Name der abzufragenden Tabelle.
    • Achten Sie darauf, dass für Dateiformat die Option "Cloud Bigtable" ausgewählt ist.
  4. Gehen Sie auf der Seite Create Table im Bereich Destination Table so vor:

    • Wählen Sie für Tabellenname das entsprechende Dataset aus und geben Sie in das Feld für den Tabellennamen den Namen der permanenten Tabelle ein, die Sie in BigQuery erstellen.
    • Prüfen Sie, ob für Table type die Option Externe Tabelle festgelegt ist.
  5. Verwenden Sie im Feld Column Family and Qualifiers die Option Add Family, um Spaltenfamilien und Qualifizierer anzugeben. Sie können auch auf Edit as text klicken und ein JSON-Array aus Spaltenfamilien und Qualifizierern eingeben. Durch diese Liste werden die in Abfragen referenzierbaren Spaltenfamilien eingeschränkt und ihre Werttypen angegeben. Beispiel:

      [
        {
          "familyId": "family_int",
          "type": "INTEGER",
          "encoding": "BINARY",
          "onlyReadLatest": "true",
          "columns": [
            {
              "qualifierString": "foo",
              "onlyReadLatest": "true"
            }
          ]
        }
      ]
    
    Sie können mithilfe der Liste der Spaltenqualifizierer Werttypen umwandeln. Wenn Sie die Liste leer lassen, werden alle Spaltenfamilien in das Tabellenschema aufgenommen und ihre Werte als BYTES gelesen. Weitere Informationen finden Sie im Abschnitt zu den Cloud Bigtable-Optionen in der API-Dokumentation zu externalDataConfiguration.

  6. Wählen Sie im Abschnitt Options die entsprechenden Elemente aus und klicken Sie dann auf Create Table.

Die erstellte permanente Tabelle können Sie wie eine native BigQuery-Tabelle abfragen. Nach Abschluss der Abfrage können Sie die Ergebnisse als CSV- oder JSON-Datei exportieren oder als Tabelle bzw. in Google Tabellen speichern.

bq

Sie erstellen eine Tabelle im BigQuery-Befehlszeilentool mit dem Befehl bq mk. Wenn Sie mit dem bq-Befehlszeilentool eine Tabelle erstellen, die mit einer externen Datenquelle verknüpft ist, können Sie das Schema der Tabelle mit einer Tabellendefinitionsdatei identifizieren:

  1. Zum Erstellen einer permanente Tabelle verwenden Sie den Befehl bq mk.

    bq mk \
    --external_table_definition=definition_file \
    dataset.table
    

    Dabei gilt:

    • definition_file ist der Pfad zur Tabellendefinitionsdatei auf Ihrem lokalen Rechner.
    • dataset ist der Name des Datasets, das die Tabelle enthält.
    • table der Name der Tabelle ist, die Sie erstellen.

    Sie können die Tabelle anschließend wie eine native BigQuery-Tabelle abfragen. Dabei gelten die Einschränkungen für externe Datenquellen.

API

  • Für das Attribut sourceUris in der Tabellenressource können Sie genau einen Cloud Bigtable-URI angeben. Dieser muss eine vollständige, gültige HTTPS-URL sein.

  • Geben Sie die Attribute für das Datenformat an. Legen Sie dazu das Attribut sourceFormat fest. Geben Sie für Cloud Bigtable "BIGTABLE" an.

Cloud Bigtable-Daten mithilfe temporärer externer Tabellen abfragen

Wenn Sie eine externe Datenquelle abfragen möchten, ohne eine permanente Tabelle zu erstellen, müssen Sie einen Befehl ausführen, der Folgendes kombiniert:

  • Eine Tabellendefinitionsdatei mit einer Abfrage
  • Eine Inline-Schemadefinition mit einer Abfrage
  • Eine JSON-Schemadefinitionsdatei mit einer Abfrage

Die temporäre externe Tabelle wird mit der Tabellendefinition bzw. dem bereitgestellten Schema erstellt. Anschließend erfolgt die Abfrage der temporären externen Tabelle. Das Abfragen einer externen Datenquelle mithilfe einer temporären Tabelle wird vom bq-Befehlszeilentool und der API unterstützt.

Wenn Sie eine temporäre externe Tabelle verwenden, erstellen Sie keine Tabelle in einem Ihrer BigQuery-Datasets. Da die Tabelle nicht permanent in einem Dataset gespeichert wird, kann sie nicht für andere Nutzer freigegeben werden. Das Abfragen einer externen Datenquelle mithilfe einer temporären Tabelle eignet sich für einmalige Ad-hoc-Abfragen von externen Daten sowie für ETL-Vorgänge (Extraktion, Transformation, Laden).

Temporäre externe Tabelle erstellen und abfragen

So fragen Sie Cloud Bigtable-Daten mithilfe einer temporären externen Tabelle ab:

Das Erstellen und Abfragen einer temporären externen Tabelle wird derzeit vom bq-Befehlszeilentool und der API unterstützt.

bq

Zum Abfragen einer temporären Tabelle mithilfe einer Tabellendefinitionsdatei geben Sie den Befehl bq query mit dem Flag --external_table_definition ein.

Optional: Geben Sie das Flag --location an und legen Sie als Wert Ihren Standort fest.

bq --location=location query \
--use_legacy_sql=false \
--external_table_definition=table::definition_file \
'query'

Dabei gilt:

  • location ist der Name Ihres Standorts. Das Flag --location ist optional.
  • table ist der Name der temporären Tabelle, die Sie erstellen.
  • definition_file ist der Pfad zur Tabellendefinitionsdatei auf Ihrem lokalen Rechner.
  • query ist die Abfrage, die Sie an die temporäre Tabelle stellen.

Mit dem folgenden Befehl wird beispielsweise die temporäre Tabelle follows mithilfe der Tabellendefinitionsdatei follows_def erstellt und abgefragt:

bq query \
--use_legacy_sql=false \
--external_table_definition=follows::/tmp/follows_def \
'SELECT
  COUNT(rowkey)
 FROM
   follows'

API

  • Erstellen Sie eine Abfrage. Unter Daten abfragen finden Sie Informationen zum Erstellen eines Abfragejobs.

  • Optional: Geben Sie Ihren Standort im Attribut location im Abschnitt jobReference der Jobressource an.

  • Legen Sie die Attribute der externen Datenquelle mit ExternalDataConfiguration für die Tabellenressource fest.

Hinweise zur Leistung

Die Leistung beim Abfragen externer Cloud Bigtable-Datenquellen hängt von drei Faktoren ab:

  • Der Anzahl der Zeilen
  • Der Menge der gelesenen Daten
  • Dem Grad der Parallelisierung

BigQuery versucht, so wenig Daten wie möglich zu lesen, indem nur die in der Abfrage angegebenen Spaltenfamilien gelesen werden. Der Grad der Parallelisierung hängt davon ab, wie viele Knoten der Cloud Bigtable-Cluster enthält und wie viele Teilungen es in Ihrer Tabelle gibt.

Cloud Bigtable führt abhängig von der Last Teilungen automatisch zusammen. Wenn die Tabelle nicht oft gelesen wird, sinkt die Anzahl der Teilungen im Laufe der Zeit und die Abfrageleistung geht allmählich zurück. Weitere Informationen zum Teilen einer Tabelle anhand des Zeilenschlüssels finden Sie unter Tabellen verwalten.

Beim Abfragen von Cloud Bigtable über BigQuery werden Cloud Bigtable-CPU-Zyklen genutzt. Die CPU-Nutzung durch BigQuery kann die Latenz und den Durchsatz für andere, gleichzeitige Abfragen beeinträchtigen, z. B. für die Bereitstellung von Livenutzer-Traffic. Eine hohe CPU-Nutzung durch Cloud Bigtable beeinträchtigt z. B. Longtail-Abfragen und erhöht die Latenz für das 99. Perzentil.

Achten Sie bei der CPU-Nutzung von Cloud Bigtable darauf, dass die im Monitoring-Dashboard der Cloud Console empfohlenen Grenzen für Cloud Bigtable nicht überschritten werden. Wenn Sie die Anzahl der Knoten für Ihre Instanz erhöhen, können Sie sowohl BigQuery-Traffic als auch Traffic von anderen, gleichzeitigen Anfragen besser verarbeiten.

Generiertes Schema

Standardmäßig stellt BigQuery die Werte in einer Spaltenfamilie als Array von Spalten bereit, das wiederum ein Array von Werten enthält, die mit verschiedenen Zeitstempeln versehen sind. Durch dieses Schema wird das ursprüngliche Layout der Daten in Cloud Bigtable bewahrt, aber die SQL-Abfragen können recht schwierig sein. Es ist möglich, Spalten in Teilfeldern innerhalb der übergeordneten Spaltenfamilie zu platzieren und nur den neuesten Wert aus jeder Zelle zu lesen. Dabei werden beide Arrays im Standardschema als skalare Werte dargestellt.

Beispiel

Angenommen, Sie speichern Nutzerprofile für ein fiktives soziales Netzwerk. Ein mögliches Datenmodell dafür wäre die Spaltenfamilie profile mit einzelnen Spalten für gender, age und email:

rowkey | profile:gender| profile:age| profile:email
-------| --------------| -----------| -------------
alice  | female        | 30         | alice@gmail.com

Mithilfe des Standardschemas könnte die Anzahl der männlichen Nutzer über 30 so abgefragt werden:

SELECT
  COUNT(1)
FROM
  `dataset.table`
OMIT
  RECORD IF NOT SOME(profile.column.name = "gender"
    AND profile.column.cell.value = "male")
  OR NOT SOME(profile.column.name = "age"
    AND INTEGER(profile.column.cell.value) > 30)

Das Abfragen der Daten ist weniger schwierig, wenn gender und age als Teilfelder bereitgestellt werden. Wenn Sie diese Werte als Teilfelder bereitstellen möchten, listen Sie gender und age beim Definieren der Tabelle in der Spaltenfamilie profile als benannte Spalten auf. Sie können BigQuery auch anweisen, die neuesten Werte aus dieser Spaltenfamilie bereitzustellen. In der Regel ist nur der neueste (und möglicherweise einzige) Wert von Interesse.

Wenn Sie die Spalten als Teilfelder bereitstellen, sieht die SQL-Abfrage zur Zählung der männlichen Nutzer über 30 so aus:

SELECT
  COUNT(1)
FROM
  `dataset.table`
WHERE
  profile.gender.cell.value="male"
  AND profile.age.cell.value > 30

Beachten Sie, dass gender und age direkt als Felder angegeben sind. Die JSON-Konfiguration für dieses Szenario sieht so aus:

  "bigtableOptions": {
    "readRowkeyAsString": "true",
    "columnFamilies": [
      {
          "familyId": "profile",
          "onlyReadLatest": "true",
          "columns": [
              {
                  "qualifierString": "gender",
                  "type": "STRING"
              },
              {
                  "qualifierString": "age",
                  "type": "INTEGER"
              }
          ]
      }
    ]
  }

Wertcodierung

Cloud Bigtable speichert Daten als Rohbyte ohne Beachtung der Datencodierung. Bytewerte sind jedoch bei der Analyse mithilfe von SQL-Abfragen nur beschränkt hilfreich. Cloud Bigtable bietet zwei grundlegende Arten der Decodierung skalarer Werte: Text und HBase-binär.

Beim Textformat wird angenommen, dass alle Werte als alphanumerische Textstrings gespeichert sind. Die Ganzahl 768 wird z. B. als der String "768" gespeichert. Bei der binären Codierung wird angenommen, dass die Daten mithilfe der Methodenklasse Bytes.toBytes von HBase codiert wurden. Daher wird eine entsprechende Decodierungsmethode angewendet.

Abfragefilter

Bei Abfragen mit einem Zeilengleichheitsfilter wird nur die konkrete Zeile gelesen. Hier ein Beispiel in der SQL-Standardsyntax:

SELECT
  COUNT(follows.column.name)
FROM
  `dataset.table`
WHERE
  rowkey = "alice";

Bereichsfilter wie rowkey > '1' und rowkey < '8' werden ebenfalls unterstützt, aber nur, wenn "rowkey" als String mit der Option readRowkeyAsString gelesen wird.