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

Étapes suivantes