Utiliser des tables de caractéristiques
Cette page décrit comment créer et utiliser des tables de fonctionnalités dans Unity Catalog.
Cette page s'applique uniquement aux espaces de travail qui sont activés pour Unity Catalog. Si votre espace de travail n’est pas activé pour Unity Catalog, consultez Utiliser les tables de caractéristiques du magasin de caractéristiques d’espace de travail.
Pour plus de détails sur les commandes et les paramètres utilisés dans les exemples suivants, consultez les Informations de référence sur l’API Python de l’ingénierie de caractéristiques.
Spécifications
L’ingénierie de caractéristiques dans Unity Catalog exige Databricks Runtime 13.2 ou versions ultérieures. En outre, le metastore Unity Catalog doit disposer de Privilege Model version 1.0.
Installer l'ingénierie des fonctionnalités dans Unity Catalog - Client Python
L’ingénierie de caractéristiques dans Unity Catalog dispose d’un client Python FeatureEngineeringClient
. La classe est disponible sur PyPI dans le package databricks-feature-engineering
et est préinstallée dans Databricks Runtime 13.3 LTS ML et versions ultérieures. Si vous utilisez un Databricks Runtime non ML, vous devez installer manuellement le client. Utilisez la matrice de compatibilité pour rechercher la version appropriée à votre version Databricks Runtime.
%pip install databricks-feature-engineering
dbutils.library.restartPython()
Créer un catalogue et un schéma pour les tables de fonctionnalités dans Unity Catalog
Vous devez créer un nouveau catalogue ou utiliser un catalogue existant pour les tables de fonctionnalités.
Pour créer un nouveau catalogue, vous devez disposer du privilège CREATE CATALOG
sur le metastore.
CREATE CATALOG IF NOT EXISTS <catalog-name>
Pour utiliser un catalogue existant, vous devez disposer du privilège USE CATALOG
sur le catalogue.
USE CATALOG <catalog-name>
Les tables de fonctionnalités dans Unity Catalog doivent être stockées dans un schéma. Pour créer un nouveau schéma dans le catalogue, vous devez disposer du privilège CREATE SCHEMA
sur le catalogue.
CREATE SCHEMA IF NOT EXISTS <schema-name>
Créer une table de fonctionnalités dans Unity Catalog
Remarque
Vous pouvez utiliser une table Delta existante dans Unity Catalog qui inclut une contrainte de clé primaire en tant que table de caractéristiques. Si la table ne dispose pas d’une clé primaire définie, vous devez mettre à jour la table en utilisant des instructions ALTER TABLE
DDL pour ajouter la contrainte. Consultez Utiliser une table Delta existante dans Unity Catalog comme table de fonctionnalités.
Toutefois, l’ajout d’une clé primaire à une table de diffusion en continu ou à une vue matérialisée publiée dans Unity Catalog par un pipeline Delta Live Tables nécessite la modification du schéma de définition de la table de diffusion en continu ou de la vue matérialisée pour inclure la clé primaire, puis l’actualisation de la table de diffusion en continu ou de la vue dématérialisée. Consultez Utiliser une table de diffusion en continu ou une vue matérialisée créée par un pipeline Delta Live Tables en tant que table de caractéristiques.
Les tables de caractéristiques dans Unity Catalog sont des Tables Delta. Chaque table de fonctionnalités doit avoir une clé primaire. L’accès aux tables de caractéristiques, comme d’autres ressources de données dans Unity Catalog, s’effectue en utilisant un espace de noms à trois niveaux : <catalog-name>.<schema-name>.<table-name>
.
Vous pouvez utiliser Databricks SQL, le FeatureEngineeringClient
Python ou un pipeline Delta Live Tables pour créer des tables de caractéristiques dans Unity Catalog.
Databricks SQL
Vous pouvez utiliser n’importe quelle table Delta avec une contrainte de clé primaire comme table de caractéristiques. Le code suivant montre comment créer une table avec une clé primaire :
CREATE TABLE ml.recommender_system.customer_features (
customer_id int NOT NULL,
feat1 long,
feat2 varchar(100),
CONSTRAINT customer_features_pk PRIMARY KEY (customer_id)
);
Pour créer une table de caractéristiques de série chronologique, ajoutez une colonne heure en tant que colonne de clé primaire et spécifiez le mot clé TIMESERIES. Le mot clé TIMESERIES requiert Databricks Runtime 13.3 LTS ou une version ultérieure.
CREATE TABLE ml.recommender_system.customer_features (
customer_id int NOT NULL,
ts timestamp NOT NULL,
feat1 long,
feat2 varchar(100),
CONSTRAINT customer_features_pk PRIMARY KEY (customer_id, ts TIMESERIES)
);
Une fois la table créée, vous pouvez y écrire des données de la même façon qu’avec d’autres tables Delta et l’utiliser comme table de caractéristiques.
Python
Pour plus d’informations sur les commandes et les paramètres utilisés dans les exemples suivants, consultez les Informations de référence sur l’API Python d’ingénierie de caractéristiques.
- Écrivez les fonctions Python pour calculer les caractéristiques. La sortie de chaque fonction doit être un DataFrame Apache Spark avec une clé primaire unique. La clé primaire peut être constituée d’une ou de plusieurs colonnes.
- Créez une table de fonctionnalités en instanciant un
FeatureEngineeringClient
et en utilisantcreate_table
. - Remplissez la table de caractéristiques en utilisant
write_table
.
from databricks.feature_engineering import FeatureEngineeringClient
fe = FeatureEngineeringClient()
# Prepare feature DataFrame
def compute_customer_features(data):
''' Feature computation code returns a DataFrame with 'customer_id' as primary key'''
pass
customer_features_df = compute_customer_features(df)
# Create feature table with `customer_id` as the primary key.
# Take schema from DataFrame output by compute_customer_features
customer_feature_table = fe.create_table(
name='ml.recommender_system.customer_features',
primary_keys='customer_id',
schema=customer_features_df.schema,
description='Customer features'
)
# An alternative is to use `create_table` and specify the `df` argument.
# This code automatically saves the features to the underlying Delta table.
# customer_feature_table = fe.create_table(
# ...
# df=customer_features_df,
# ...
# )
# To use a composite primary key, pass all primary key columns in the create_table call
# customer_feature_table = fe.create_table(
# ...
# primary_keys=['customer_id', 'date'],
# ...
# )
# To create a time series table, set the timeseries_columns argument
# customer_feature_table = fe.create_table(
# ...
# primary_keys=['customer_id', 'date'],
# timeseries_columns='date',
# ...
# )
Créer une table de fonctionnalités dans Unity Catalog avec le pipeline Delta Live Tables
Remarque
La prise en charge de Delta Live Tables pour les contraintes de table est disponible dans la Préversion publique. Les exemples de code suivants doivent être exécutés à l’aide du canal en préversion Delta Live Tables.
Vous pouvez utiliser en tant que table de caractéristiques une table publiée à partir d’un pipeline Delta Live Tables qui inclut une contrainte de clé primaire. Pour créer une table dans un pipeline Delta Live Tables avec une clé primaire, vous pouvez utiliser Databricks SQL ou l’interface de programmation Python Delta Live Tables.
Pour créer une table dans un pipeline Delta Live Tables avec une clé primaire, utilisez la syntaxe suivante :
Databricks SQL
CREATE LIVE TABLE customer_features (
customer_id int NOT NULL,
feat1 long,
feat2 varchar(100),
CONSTRAINT customer_features_pk PRIMARY KEY (customer_id)
) AS SELECT * FROM ...;
Python
import dlt
@dlt.table(
schema="""
customer_id int NOT NULL,
feat1 long,
feat2 varchar(100),
CONSTRAINT customer_features_pk PRIMARY KEY (customer_id)
""")
def customer_features():
return ...
Pour créer une table de caractéristiques de série chronologique, ajoutez une colonne heure en tant que colonne de clé primaire et spécifiez le mot clé TIMESERIES.
Databricks SQL
CREATE LIVE TABLE customer_features (
customer_id int NOT NULL,
ts timestamp NOT NULL,
feat1 long,
feat2 varchar(100),
CONSTRAINT customer_features_pk PRIMARY KEY (customer_id, ts TIMESERIES)
) AS SELECT * FROM ...;
Python
import dlt
@dlt.table(
schema="""
customer_id int NOT NULL,
ts timestamp NOT NULL,
feat1 long,
feat2 varchar(100),
CONSTRAINT customer_features_pk PRIMARY KEY (customer_id, ts TIMESERIES)
""")
def customer_features():
return ...
Une fois la table créée, vous pouvez y écrire des données de la même façon qu’avec d’autres jeux de données Delta Live Tables et l’utiliser comme table de caractéristiques.
Utiliser une table Delta existante dans Unity Catalog comme table de fonctionnalités
Toute table Delta dans Unity Catalog dotée d’une clé primaire peut être une table de fonctionnalités dans Unity Catalog et vous pouvez utiliser l’interface utilisateur de fonctionnalité et l’API avec la table.
Remarque
- Seul le propriétaire de la table peut déclarer des contraintes de clé primaire. Le nom du propriétaire est indiqué sur la page de détails de la table dans Catalog Explorer.
- Vérifiez que le type de données de la table Delta est pris en charge par l’ingénierie des fonctionnalités dans Unity Catalog. Consultez Types de données pris en charge.
- Le mot clé TIMESERIES requiert Databricks Runtime 13.3 LTS ou une version ultérieure.
Si une table Delta existante ne dispose pas de contrainte de clé primaire, vous pouvez en créer une de la manière suivante :
Définissez les colonnes de clés primaires sur
NOT NULL
. Pour chaque colonne de clé primaire, exécutez :ALTER TABLE <full_table_name> ALTER COLUMN <pk_col_name> SET NOT NULL
Modifiez la table pour y ajouter la contrainte de clé primaire :
ALTER TABLE <full_table_name> ADD CONSTRAINT <pk_name> PRIMARY KEY(pk_col1, pk_col2, ...)
pk_name
est le nom de la contrainte de clé primaire. Par convention, vous pouvez utiliser le nom de la table (sans schéma ni catalogue) avec un suffixe_pk
. Par exemple, une table portant le nom"ml.recommender_system.customer_features"
aura comme nomcustomer_features_pk
pour sa contrainte de clé primaire.Pour transformer la table en une table de caractéristiques de série chronologique, spécifiez le mot clé TIMESERIES sur l’une des colonnes de clés primaires, comme suit :
ALTER TABLE <full_table_name> ADD CONSTRAINT <pk_name> PRIMARY KEY(pk_col1 TIMESERIES, pk_col2, ...)
Après votre ajout de la contrainte de clé primaire à la table, vous pouvez voir la table dans l’interface utilisateur de caractéristiques et l’utiliser comme table de caractéristiques.
Utiliser une table de diffusion en continu ou une vue matérialisée créée par un pipeline Delta Live Tables en tant que table de caractéristiques
Toute table de flux ou vue matérialisée dans le catalogue Unity avec une clé primaire peut être une table de fonctionnalités dans Unity Catalog, et vous pouvez utiliser l’interface utilisateur et l’API des fonctionnalités avec la table.
Remarque
- La prise en charge de Delta Live Tables pour les contraintes de table est disponible dans la Préversion publique. Les exemples de code suivants doivent être exécutés à l’aide du canal en préversion Delta Live Tables.
- Seul le propriétaire de la table peut déclarer des contraintes de clé primaire. Le nom du propriétaire est indiqué sur la page de détails de la table dans Catalog Explorer.
- Vérifiez que le type de données de la table Delta est pris en charge par l’ingénierie de caractéristiques dans Unity Catalog. Consultez Types de données pris en charge.
Pour définir les clés primaires d’une table de diffusion en continu ou d’une vue matérialisée existantes, mettez à jour le schéma de la table de diffusion en continu ou de la vue matérialisée dans le notebook qui gère l’objet. Ensuite, actualisez la table pour mettre à jour l’objet Unity Catalog.
Vous utilisez la syntaxe suivante pour ajouter une clé primaire à une vue dématérialisée :
Databricks SQL
CREATE OR REFRESH MATERIALIZED VIEW existing_live_table(
id int NOT NULL PRIMARY KEY,
...
) AS SELECT ...
Python
import dlt
@dlt.table(
schema="""
id int NOT NULL PRIMARY KEY,
...
"""
)
def existing_live_table():
return ...
Mettre à jour une table de fonctionnalités dans Unity Catalog
Vous pouvez mettre à jour une table de fonctionnalités dans Unity Catalog en ajoutant de nouvelles fonctionnalités ou en modifiant des lignes spécifiques en fonction de la clé primaire.
Les métadonnées suivantes de la table de fonctionnalités ne doivent pas être mises à jour :
- Clé primaire
- Clé de partition.
- Nom ou type de données d’une fonctionnalité existante.
Leur modification entraîne l’arrêt des pipelines en aval qui utilisent des fonctionnalités pour la formation et le service des modèles.
Ajouter de nouvelles fonctionnalités à une table de fonctionnalités existante dans Unity Catalog
Vous pouvez ajouter de nouvelles caractéristiques à une table de caractéristiques existante de l’une des deux manières suivantes :
- Mettez à jour la fonction de calcul de caractéristique existante et exécutez
write_table
avec le DataFrame retourné. Cette opération met à jour le schéma de la table de caractéristiques et fusionne les nouvelles valeurs de caractéristiques en fonction de la clé primaire. - Créez une fonction de calcul de caractéristique pour calculer les nouvelles valeurs de caractéristiques. Le DataFrame retourné par cette nouvelle fonction de calcul doit contenir les clés de partition et primaires des tables de caractéristiques (si elles sont définies). Exécutez
write_table
avec le DataFrame pour écrire les nouvelles caractéristiques dans la table de caractéristiques existante, en utilisant la même clé primaire.
Mettre à jour uniquement des lignes spécifiques dans une table de caractéristiques
Utilisez mode = "merge"
dans write_table
. Les lignes dont la clé primaire n’existe pas dans le DataFrame envoyé dans l’appel write_table
restent inchangées.
from databricks.feature_engineering import FeatureEngineeringClient
fe = FeatureEngineeringClient()
fe.write_table(
name='ml.recommender_system.customer_features',
df = customer_features_df,
mode = 'merge'
)
Planifier un travail pour mettre à jour une table de caractéristiques
Pour que les caractéristiques dans les tables de caractéristiques possèdent toujours les valeurs les plus récentes, Databricks recommande de créer un travail qui exécute un notebook afin de mettre à jour votre table de caractéristiques régulièrement, par exemple tous les jours. Si vous avez déjà créé un travail non planifié, vous pouvez le convertir en travail planifié pour veiller à ce que les valeurs des caractéristiques soient toujours à jour. Consultez Planifier et orchestrer des flux de travail.
Le code pour mettre à jour une table de caractéristiques utilise mode='merge'
, comme illustré dans l’exemple suivant.
from databricks.feature_engineering import FeatureEngineeringClient
fe = FeatureEngineeringClient()
customer_features_df = compute_customer_features(data)
fe.write_table(
df=customer_features_df,
name='ml.recommender_system.customer_features',
mode='merge'
)
Stocker les valeurs passées des caractéristiques quotidiennes
Définissez une table de caractéristiques avec une clé primaire composite. Incluez la date dans la clé primaire. Par exemple, pour une table de caractéristiques customer_features
, vous pouvez utiliser une clé primaire composite (date
, customer_id
) et une clé de partition date
afin d’effectuer des lectures efficaces.
Databricks vous recommande d’activer le clustering liquide sur la table pour des lectures efficaces. Si vous n’utilisez pas le clustering liquide, définissez la colonne de date comme clé de partition pour améliorer les performances de lecture.
Databricks SQL
CREATE TABLE ml.recommender_system.customer_features (
customer_id int NOT NULL,
`date` date NOT NULL,
feat1 long,
feat2 varchar(100),
CONSTRAINT customer_features_pk PRIMARY KEY (`date`, customer_id)
)
-- If you are not using liquid clustering, uncomment the following line.
-- PARTITIONED BY (`date`)
COMMENT "Customer features";
Python
from databricks.feature_engineering import FeatureEngineeringClient
fe = FeatureEngineeringClient()
fe.create_table(
name='ml.recommender_system.customer_features',
primary_keys=['date', 'customer_id'],
# If you are not using liquid clustering, uncomment the following line.
# partition_columns=['date'],
schema=customer_features_df.schema,
description='Customer features'
)
Vous pouvez ensuite créer du code pour effectuer des opérations de lecture dans la table de caractéristiques en filtrant date
sur la période digne d’intérêt.
Vous pouvez également créer une table de caractéristiques de série chronologique qui active les recherches ponctuelles lorsque vous utilisez create_training_set
ou score_batch
. Veuillez consulter Créer une table de caractéristiques dans Unity Catalog.
Pour tenir à jour la table de caractéristiques, configurez un travail régulièrement planifié pour écrire des caractéristiques ou diffusez en continu de nouvelles valeurs de caractéristiques dans la table de caractéristiques.
Créer un pipeline de calcul de caractéristique en streaming pour mettre à jour les caractéristiques
Pour créer un pipeline de calcul de caractéristique en streaming, transmettez un streaming DataFrame
en tant qu’argument à write_table
. La méthode retourne un objet StreamingQuery
.
def compute_additional_customer_features(data):
''' Returns Streaming DataFrame
'''
pass
from databricks.feature_engineering import FeatureEngineeringClient
fe = FeatureEngineeringClient()
customer_transactions = spark.readStream.table("prod.events.customer_transactions")
stream_df = compute_additional_customer_features(customer_transactions)
fe.write_table(
df=stream_df,
name='ml.recommender_system.customer_features',
mode='merge'
)
Lire à partir d’une table de caractéristiques dans Unity Catalog
Utilisez read_table
pour lire les valeurs de caractéristique.
from databricks.feature_engineering import FeatureEngineeringClient
fe = FeatureEngineeringClient()
customer_features_df = fe.read_table(
name='ml.recommender_system.customer_features',
)
Rechercher et parcourir des tables de fonctionnalités dans Unity Catalog
Utilisez l’IU des fonctionnalités pour rechercher ou parcourir des tables de fonctionnalités dans Unity Catalog.
Cliquez sur Fonctionnalités dans la barre latérale pour afficher l’interface utilisateur des fonctionnalités.
Sélectionnez un catalogue à l’aide du sélecteur de catalogue pour afficher toutes les tables de fonctionnalités disponibles dans ce catalogue. Dans la zone de recherche, vous pouvez entrer tout ou partie du nom d’une table de fonctionnalités, d’une fonctionnalité ou d’un commentaire. Vous pouvez également entrer tout ou partie de la clé ou valeur d’une étiquette. Le texte de la recherche ne respecte pas la casse.
Obtenir les métadonnées des tables de fonctionnalités dans Unity Catalog
Utilisez get_table
pour obtenir des métadonnées de table de fonctionnalités.
from databricks.feature_engineering import FeatureEngineeringClient
fe = FeatureEngineeringClient()
ft = fe.get_table(name="ml.recommender_system.user_feature_table")
print(ft.features)
Utilisez des balises avec des tables de fonctionnalités et des fonctionnalités dans Unity Catalog
Vous pouvez utiliser des balises, qui sont des paires clé-valeur simples, pour catégoriser et gérer vos tables de fonctionnalités et vos fonctionnalités.
Pour les tables de fonctionnalités, vous pouvez créer, modifier et supprimer des balises à l’aide de l’Explorateur de catalogues, d’instructions SQL dans un notebook ou l’éditeur de requête SQL ou de l’API Python d’ingénierie de caractéristiques.
Pour les fonctionnalités, vous pouvez créer, modifier et supprimer des balises à l’aide de l’Explorateur de catalogues ou d’instructions SQL dans un notebook ou l’éditeur de requête SQL.
Consultez Appliquer des balises aux objets sécurisables Unity Catalog et Ingénierie de caractéristiques et API Python du Feature Store de l’espace de travail.
L’exemple suivant montre comment utiliser l’ingénierie de caractéristiques d’API Python pour créer, mettre à jour et supprimer des balises de tables de fonctionnalités.
from databricks.feature_engineering import FeatureEngineeringClient
fe = FeatureEngineeringClient()
# Create feature table with tags
customer_feature_table = fe.create_table(
# ...
tags={"tag_key_1": "tag_value_1", "tag_key_2": "tag_value_2", ...},
# ...
)
# Upsert a tag
fe.set_feature_table_tag(name="customer_feature_table", key="tag_key_1", value="new_key_value")
# Delete a tag
fe.delete_feature_table_tag(name="customer_feature_table", key="tag_key_2")
Supprimer une table de fonctionnalités dans Unity Catalog
Vous pouvez supprimer une table de fonctionnalités dans Unity Catalog en supprimant directement la table Delta dans Unity Catalog à l’aide de l’explorateur de catalogue ou en utilisant l’ingénierie de caractéristiques d’API Python.
Remarque
- La suppression d’une table de caractéristiques peut entraîner des défaillances inattendues dans les producteurs en amont et les consommateurs en aval (modèles, points de terminaison et travaux planifiés). Vous devez supprimer les magasins en ligne publiés avec votre fournisseur cloud.
- Lorsque vous supprimez une table de fonctionnalités dans Unity Catalog, la table Delta sous-jacente est également supprimée.
drop_table
n’est pas prise en charge dans Databricks Runtime 13.1 ML ou ses versions antérieures. Utilisez la commande SQL pour supprimer la table.
Vous pouvez utiliser Databricks SQL ou FeatureEngineeringClient.drop_table
pour supprimer une table de fonctionnalités dans Unity Catalog :
Databricks SQL
DROP TABLE ml.recommender_system.customer_features;
Python
from databricks.feature_engineering import FeatureEngineeringClient
fe = FeatureEngineeringClient()
fe.drop_table(
name='ml.recommender_system.customer_features'
)
Partager une table de fonctionnalités dans le catalogue Unity entre des espaces de travail ou des comptes
Une table de fonctionnalités dans le catalogue Unity est accessible à tous les espaces de travail affectés au metastore du catalogue Unity de la table.
Pour partager une table de fonctionnalités avec des espaces de travail qui ne sont pas affectés au même metastore du catalogue Unity, utilisez le partage Delta.