Strukturierte Zeilenschlüsselabfragen
Wenn eine Tabelle ein Zeilenschlüssel-Schema mit strukturierten Zeilenschlüsseln hat, können Sie die einzelnen Segmente oder Spalten des Zeilenschlüssels mit SQL abfragen.
Bei kontinuierlichen materialisierten Ansichten, einschließlich globaler sekundärer Indexe, werden standardmäßig strukturierte Zeilenschlüssel generiert. Sie können auch einen strukturierten Zeilenschlüssel für jede Bigtable-Tabelle definieren, die Sie mit SQL abfragen möchten. Dazu erstellen Sie ein Zeilenschlüssel-Schema für die Tabelle. Weitere Informationen finden Sie unter Schemas für Zeilenschlüssel verwalten.
Schlüssel
In einer Bigtable-Tabelle ohne strukturiertes Zeilenschlüsselschema wird jede Zeile durch einen 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 Werte in der Spalte _key
zurückgegeben, wenn Sie eine SELECT *
-Abfrage für die Tabelle ausführen.
In einer Tabelle mit einem Zeilenschlüssel-Schema ist der Zeilenschlüssel (Primärschlüssel) die Kombination aller Spalten, die als Felder im Zeilenschlüssel-Schema angegeben sind. Wenn Sie einer Tabelle ein Zeilenschlüsselschema hinzufügen, wird die Spalte _key
zu einer Pseudospalte. Das bedeutet, dass sie nicht in einer SELECT *
-Abfrage angezeigt wird, Sie sie aber explizit mit einer SELECT _key
-Anweisung auswählen können.
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" | „Schuhe“ | „nike_hyperdunk“ |
„user2#2025-05-24#defg456“ | „Kopfhörer“ | „sony_wh_1000mx5“ |
Strukturierte Ergebnisse von Zeilenschlüsselabfragen
Da die Tabelle sales
strukturierte Zeilenschlüssel hat, wird bei einer Abfrage der Tabelle mit einer SELECT *
-Anweisung jedes Segment des Zeilenschlüssels als separate Spalte zurückgegeben. 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 so aus:
user_id | purchase_date | order_number | Produkt |
---|---|---|---|
Nutzer 1 | 2025-05-20 | "abcd1233" | { product_type: "phone", product_name: "iPhone16_pro_max" } |
Nutzer 1 | 2025-05-20 | "abcd1235" | { product_type: "shoes", product_name: "nike_hyperdunk" } |
Nutzerin 2 | 2025-05-24 | „defg456“ | { product_type: "headphones", product_name: "sony_wh_1000mx5" } |
Sie können die Spalten für Zeilenschlüssel auch in Ihrer 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“ |
„Schuhe“ | „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 |
---|---|
Nutzerin 2 | „sony_wh_1000mx5“ |
Aggregatabfragen
Das folgende Beispiel zeigt, wie Sie eine Aggregatabfrage für strukturierte Zeilenschlüsselfelder verwenden:
SELECT
user_id,
product[product_type] AS product_type,
count(*) AS count
FROM sales
GROUP BY 1, 2
Die Abfrageergebnisse sehen so aus:
user_id | product_type | Anzahl |
---|---|---|
Nutzer 1 | Telefon | 1 |
Nutzer 1 | Schuhe | 1 |
Nutzerin 2 | Kopfhörer | 1 |
Originalzeilenschlüssel
Wenn Sie den ursprünglichen Zeilenschlüssel in einer Tabelle mit strukturierten Zeilenschlüsseln abrufen möchten, geben Sie die Spalte _key
in Ihrer Abfrage an.
SELECT
_key, user_id
FROM sales
Die Abfrage gibt Folgendes zurück:
_key | user_id |
---|---|
"user1#2025-05-20#abcd1233" | Nutzer 1 |
"user1#2025-05-20#abcd1235" | Nutzer 1 |
„user2#2025-05-24#defg456“ | Nutzerin 2 |