Requêtes structurées sur les clés de ligne
Si une table possède un schéma de clé de ligne qui définit des clés de ligne structurées, vous pouvez utiliser SQL pour interroger les segments ou colonnes individuels de la clé de ligne.
Les vues matérialisées continues, y compris les index secondaires globaux, génèrent des clés de ligne structurées par défaut. Vous pouvez également définir une clé de ligne structurée pour toute table Bigtable que vous souhaitez interroger avec SQL en créant un schéma de clé de ligne pour la table. Pour en savoir plus, consultez Gérer les schémas de clés de ligne.
Clés
Dans une table Bigtable sans schéma de clé de ligne structuré, chaque ligne est indexée par une seule clé de ligne. Lorsque vous interrogez la table avec SQL, la clé de ligne est une colonne nommée _key
que SQL utilise comme clé primaire. Il ne s'agit pas d'une pseudocolonne. Par conséquent, les valeurs de la colonne _key
sont renvoyées lorsque vous exécutez une requête SELECT *
sur la table.
En revanche, dans une table qui possède un schéma de clé de ligne, la clé de ligne (clé primaire) est la combinaison de toutes les colonnes nommées en tant que champs dans le schéma de clé de ligne. Lorsque vous ajoutez un schéma de clé de ligne à une table, la colonne _key
devient une pseudo-colonne. Cela signifie qu'elle ne s'affiche pas dans une requête SELECT *
, mais que vous pouvez la sélectionner explicitement avec une instruction SELECT _key
.
Exemples de requêtes
Les exemples de cette section supposent qu'une table nommée sales
présente le schéma suivant :
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 "#" }
}
Le tableau sales
contient les données suivantes. La famille de colonnes product
comporte deux colonnes.
clé de ligne | produit | |
---|---|---|
product_type | product_name | |
"user1#2025-05-20#abcd1233" | "phone" | "iPhone16_pro_max" |
"user1#2025-05-20#abcd1235" | "chaussures" | "nike_hyperdunk" |
"user2#2025-05-24#defg456" | "casque" | "sony_wh_1000mx5" |
Résultats de requête de clé de ligne structurée
Étant donné que la table sales
comporte des clés de ligne structurées, si vous interrogez la table avec une instruction SELECT *
, la requête renvoie chaque segment de la clé de ligne sous forme de colonne distincte. Comme dans toute requête SQL adressée à une table Bigtable, les colonnes d'une famille de colonnes sont exprimées sous forme de cartes.
SELECT * from sales
Les résultats se présentent comme suit :
user_id | purchase_date | order_number | produit |
---|---|---|---|
utilisateur1 | 2025-05-20 | "abcd1233" | { product_type: "phone", product_name: "iPhone16_pro_max" } |
utilisateur1 | 2025-05-20 | "abcd1235" | { product_type: "shoes", product_name: "nike_hyperdunk" } |
utilisateur2 | 2025-05-24 | "defg456" | { product_type: "headphones", product_name: "sony_wh_1000mx5" } |
Vous pouvez également spécifier les colonnes de clés de ligne dans votre requête, comme illustré dans l'exemple suivant :
SELECT
product[product_type] AS product_type,
product[product_name] AS product_name
FROM sales
WHERE user_id = b"user1"
Les résultats se présentent comme suit :
product_type | product_name |
---|---|
"phone" | "iphone16_pro_max" |
"chaussures" | "nike_hyperdunk" |
Filtres
Vous pouvez filtrer les colonnes du schéma de clé de ligne à l'aide de fonctions SQL. L'exemple suivant suppose que CURRENT_DATE()
renvoie 2025-05-24
:
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"
Les résultats sont les suivants :
user_id | product_name |
---|---|
utilisateur2 | "sony_wh_1000mx5" |
Requêtes d'agrégation
L'exemple suivant montre comment utiliser une requête d'agrégation sur des champs de clé de ligne structurés :
SELECT
user_id,
product[product_type] AS product_type,
count(*) AS count
FROM sales
GROUP BY 1, 2
Les résultats de la requête sont les suivants :
user_id | product_type | nombre |
---|---|---|
utilisateur1 | téléphone | 1 |
utilisateur1 | chaussures | 1 |
utilisateur2 | écouteurs | 1 |
Clé de ligne d'origine
Pour récupérer la clé de ligne d'origine dans une table avec des clés de ligne structurées, spécifiez la colonne _key
dans votre requête.
SELECT
_key, user_id
FROM sales
La requête renvoie l'erreur suivante :
_key | user_id |
---|---|
"user1#2025-05-20#abcd1233" | utilisateur1 |
"user1#2025-05-20#abcd1235" | utilisateur1 |
"user2#2025-05-24#defg456" | utilisateur2 |