Abfragen mit strukturierten Zeilenschlüsseln

Wenn eine Tabelle ein Zeilenschlüsselschema hat, das strukturierte Zeilenschlüssel definiert, können Sie mit SQL die einzelnen Segmente oder Spalten des Zeilenschlüssels abfragen.

Kontinuierliche materialisierte Ansichten, einschließlich asynchroner sekundärer Indexe, generieren standardmäßig strukturierte Zeilenschlüssel. Sie können auch einen strukturierten Zeilenschlüssel für jede Bigtable-Tabelle definieren, die Sie mit SQL abfragen möchten, indem Sie ein Zeilenschlüsselschema für die Tabelle erstellen. Weitere Informationen finden Sie unter Zeilenschlüsselschemas verwalten.

Schlüssel

In einer Bigtable-Tabelle ohne strukturiertes Zeilenschlüsselschema wird jede Zeile mit einem einzelnen Zeilenschlüssel indexiert. Wenn Sie die Tabelle mit SQL abfragen, ist der Zeilenschlüssel eine Spalte mit dem Namen _key, die von SQL als Primärschlüssel verwendet wird. Es handelt sich nicht um eine Pseudospalte. Daher werden die Werte in der Spalte _key zurückgegeben, wenn Sie eine SELECT *-Abfrage für die Tabelle ausführen.

In einer Tabelle mit einem Zeilenschlüsselschema ist der Zeilenschlüssel (Primärschlüssel) dagegen die Kombination aller Spalten, die im Zeilenschlüsselschema als Felder angegeben sind. Wenn Sie einer Tabelle ein Zeilenschlüsselschema hinzufügen, wird die _key Spalte zu einer Pseudospalte. Das bedeutet, dass sie in einer SELECT * Abfrage nicht angezeigt wird. Sie können sie aber explizit mit einer SELECT _key Anweisung auswählen.

Beispielabfragen

In den Beispielen in diesem Abschnitt wird davon ausgegangen, dass eine Tabelle mit dem Namen sales das folgende Schema hat:

  field {
    field_name: "user_id"
    type: { bytes_type { encoding { raw {} } } }
  }
  field {
    field_name: "purchase_date"
    type: { string_type { encoding { utf8_bytes {} } } }
  }
  field {
    field_name: "order_number"
    type: { string_type { encoding { utf8_bytes {} } } }
  }
  encoding {
    delimited_bytes { delimiter "#" }
  }

Die Tabelle sales enthält die folgenden Daten. Die Spaltenfamilie product hat zwei Spalten.

Zeilenschlüssel Produkt
  product_type product_name
"user1#2025-05-20#abcd1233" "phone" "iPhone16_pro_max"
"user1#2025-05-20#abcd1235" "shoes" "nike_hyperdunk"
"user2#2025-05-24#defg456" "headphones" "sony_wh_1000mx5"

Ergebnisse von Abfragen mit strukturierten Zeilenschlüsseln

Da die Tabelle sales strukturierte Zeilenschlüssel hat, gibt die Abfrage mit einer SELECT *-Anweisung jedes Segment des Zeilenschlüssels als separate Spalte zurück. Wie bei jeder SQL-Abfrage für eine Bigtable-Tabelle werden Spalten in einer Spaltenfamilie als Maps ausgedrückt.

  SELECT * from sales

Die Ergebnisse sehen in etwa so aus:

user_id purchase_date order_number product
user1 2025-05-20 "abcd1233" { product_type: "phone", product_name: "iPhone16_pro_max" }
user1 2025-05-20 "abcd1235" { product_type: "shoes", product_name: "nike_hyperdunk" }
user2 2025-05-24 "defg456" { product_type: "headphones", product_name: "sony_wh_1000mx5" }

Sie können die Zeilenschlüsselspalten auch in der Abfrage angeben, wie im folgenden Beispiel gezeigt:

  SELECT
    product[product_type] AS product_type,
    product[product_name] AS product_name
  FROM sales
  WHERE user_id = b"user1"

Das Ergebnis sieht in etwa so aus:

product_type product_name
"phone" "iphone16_pro_max"
"shoes" "nike_hyperdunk"

Filter

Sie können die Spalten des Zeilenschlüsselschemas mit SQL-Funktionen filtern. Im folgenden Beispiel wird davon ausgegangen, dass CURRENT_DATE() den Wert 2025-05-24 zurückgibt:

  SELECT
    user_id,
    product["product_name"] AS product_name
  FROM
    sales
  WHERE
    PARSE_DATE("YYYY-MM-DD", purchase_date) = CURRENT_DATE()
    AND user_id = b"user2"

Die folgenden Ergebnisse werden ausgegeben:

user_id product_name
user2 "sony_wh_1000mx5"

Aggregatabfragen

Im folgenden Beispiel wird gezeigt, wie Sie eine Aggregatabfrage für Felder mit strukturierten Zeilenschlüsseln verwenden:

  SELECT
    user_id,
    product[product_type] AS product_type,
    count(*) AS count
  FROM sales
  GROUP BY 1, 2

Die Abfrageergebnisse sind wie folgt:

user_id product_type Anzahl
user1 Telefon 1
user1 Schuhe 1
user2 Kopfhörer 1

Ursprünglicher Zeilenschlüssel

Wenn Sie den ursprünglichen Zeilenschlüssel in einer Tabelle mit strukturierten Zeilenschlüsseln abrufen möchten, geben Sie die Spalte _key in der Abfrage an.

  SELECT
    _key, user_id
  FROM sales

Die Abfrage gibt Folgendes zurück:

_key user_id
"user1#2025-05-20#abcd1233" user1
"user1#2025-05-20#abcd1235" user1
"user2#2025-05-24#defg456" user2

Nächste Schritte