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 |