Share via


Progettazione delle funzionalità nel catalogo unity

Questa pagina descrive come creare e usare tabelle delle funzionalità nel catalogo unity.

Questa pagina si applica solo alle aree di lavoro abilitate per il catalogo Unity. Se l'area di lavoro non è abilitata per il catalogo unity, vedere Usare le funzionalità nell'archivio delle funzionalità dell'area di lavoro.

Requisiti

Progettazione di funzionalità in Unity Catalog richiede Databricks Runtime 13.2 o versione successiva. Inoltre, il metastore del catalogo Unity deve avere il modello di privilegio versione 1.0.

Installare progettazione delle funzionalità nel client Python del catalogo Unity

Progettazione delle funzionalità in Unity Catalog include un client FeatureEngineeringClientPython. La classe è disponibile in PyPI con il databricks-feature-engineering pacchetto ed è preinstallata in Databricks Runtime 13.3 LTS ML e versioni successive. Se si usa un runtime di Databricks non ML, è necessario installare manualmente il client. Usare la matrice di compatibilità per trovare la versione corretta per la versione di Databricks Runtime.

%pip install databricks-feature-engineering

dbutils.library.restartPython()

Creare un catalogo e uno schema per le tabelle delle funzionalità nel catalogo unity

È necessario creare un nuovo catalogo o usare un catalogo esistente per le tabelle delle funzionalità.

Per creare un nuovo catalogo, è necessario avere il CREATE CATALOG privilegio per il metastore.

CREATE CATALOG IF NOT EXISTS <catalog-name>

Per usare un catalogo esistente, è necessario disporre del USE CATALOG privilegio per il catalogo.

USE CATALOG <catalog-name>

Le tabelle delle funzionalità in Unity Catalog devono essere archiviate in uno schema. Per creare un nuovo schema nel catalogo, è necessario disporre del CREATE SCHEMA privilegio per il catalogo.

CREATE SCHEMA IF NOT EXISTS <schema-name>

Creare una tabella delle funzionalità nel catalogo unity

Nota

È possibile usare una tabella Delta esistente nel catalogo unity che include un vincolo di chiave primaria come tabella delle funzionalità. Se la tabella non dispone di una chiave primaria definita, è necessario aggiornare la tabella usando ALTER TABLE istruzioni DDL per aggiungere il vincolo. Vedere Usare una tabella Delta esistente in Unity Catalog come tabella delle funzionalità.

Tuttavia, l'aggiunta di una chiave primaria a una tabella di streaming o a una vista materializzata pubblicata in Unity Catalog da una pipeline di tabelle Live Delta richiede la modifica dello schema della tabella di streaming o della definizione della vista materializzata per includere la chiave primaria e quindi aggiornare la tabella di streaming o la vista materializzata. Vedere Usare una tabella di streaming o una vista materializzata creata da una pipeline di tabelle live Delta come tabella delle funzionalità.

Le tabelle delle funzionalità nel catalogo Unity sono tabelle Delta. Le tabelle delle funzionalità devono avere una chiave primaria. Le tabelle delle funzionalità, come gli altri asset di dati in Unity Catalog, sono accessibili usando uno spazio dei nomi a tre livelli: <catalog-name>.<schema-name>.<table-name>.

È possibile usare Databricks SQL, Python FeatureEngineeringCliento una pipeline delta live tables per creare tabelle delle funzionalità nel catalogo unity.

Databricks sql

È possibile usare qualsiasi tabella Delta con un vincolo di chiave primaria come tabella delle funzionalità. Il codice seguente illustra come creare una tabella con una chiave primaria:

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)
);

Per creare una tabella delle funzionalità della serie temporale, aggiungere una colonna temporale come colonna chiave primaria e specificare la parola chiave TIME edizione Standard RIES. La parola chiave TIME edizione Standard RIES richiede Databricks Runtime 13.3 LTS o versione successiva.

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)
);

Dopo aver creato la tabella, è possibile scrivere dati in esso come altre tabelle Delta e usarla come tabella delle funzionalità.

Python

Per informazioni dettagliate sui comandi e sui parametri usati negli esempi seguenti, vedere le informazioni di riferimento sull'API Python di progettazione delle funzionalità.

  1. Scrivere le funzioni Python per calcolare le funzionalità. L'output di ogni funzione deve essere un dataframe Apache Spark con una chiave primaria univoca. La chiave primaria può essere costituita da una o più colonne.
  2. Creare una tabella delle funzionalità creando un'istanza FeatureEngineeringClient di e usando create_table.
  3. Popolare la tabella delle funzionalità usando 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',
#   ...
# )

Tabelle live delta

Nota

Il supporto delle tabelle live delta per i vincoli di tabella è disponibile in anteprima pubblica. Gli esempi di codice seguenti devono essere eseguiti usando il canale di anteprima delle tabelle live Delta.

Qualsiasi tabella pubblicata da una pipeline delta live tables che include un vincolo di chiave primaria può essere usata come tabella delle funzionalità. Usare la sintassi seguente per creare una tabella in una pipeline delta live tables con una chiave primaria:

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 ...;

Per creare una tabella delle funzionalità della serie temporale, aggiungere una colonna temporale come colonna chiave primaria e specificare la parola chiave TIME edizione Standard RIES.

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 ...;

Dopo aver creato la tabella, è possibile scrivere dati in esso come altri set di dati delta Live Tables e usarli come tabella delle funzionalità.

La definizione dei vincoli di tabella è supportata solo dall'interfaccia SQL delle tabelle live Delta. Per impostare le chiavi primarie per le tabelle di streaming o le viste materializzate dichiarate in Python, vedere Usare una tabella di streaming o una vista materializzata creata da una pipeline di tabelle live Delta come tabella delle funzionalità.

Usare una tabella Delta esistente nel catalogo Unity come tabella delle funzionalità

Qualsiasi tabella Delta nel catalogo Unity con una chiave primaria può essere una tabella delle funzionalità nel catalogo unity ed è possibile usare l'interfaccia utente delle funzionalità e l'API con la tabella.

Nota

  • Solo il proprietario della tabella può dichiarare vincoli di chiave primaria. Il nome del proprietario viene visualizzato nella pagina dei dettagli della tabella di Esplora cataloghi.
  • Verificare che il tipo di dati nella tabella Delta sia supportato da Progettazione funzionalità in Unity Catalog. Vedere Tipi di dati supportati.
  • La parola chiave TIME edizione Standard RIES richiede Databricks Runtime 13.3 LTS o versione successiva.

Se una tabella Delta esistente non ha un vincolo di chiave primaria, è possibile crearne una come indicato di seguito:

  1. Impostare le colonne chiave primaria su NOT NULL. Per ogni colonna chiave primaria, eseguire:

    ALTER TABLE <full_table_name> ALTER COLUMN <pk_col_name> SET NOT NULL
    
  2. Modificare la tabella per aggiungere il vincolo di chiave primaria:

    ALTER TABLE <full_table_name> ADD CONSTRAINT <pk_name> PRIMARY KEY(pk_col1, pk_col2, ...)
    

    pk_name è il nome del vincolo di chiave primaria. Per convenzione, è possibile usare il nome della tabella (senza schema e catalogo) con un _pk suffisso. Ad esempio, una tabella con il nome "ml.recommender_system.customer_features" avrebbe customer_features_pk il nome del vincolo di chiave primaria.

    Per rendere la tabella una tabella delle funzionalità della serie temporale, specificare la parola chiave TIME edizione Standard RIES in una delle colonne chiave primaria, come indicato di seguito:

    ALTER TABLE <full_table_name> ADD CONSTRAINT <pk_name> PRIMARY KEY(pk_col1 TIMESERIES, pk_col2, ...)
    

    Dopo aver aggiunto il vincolo di chiave primaria nella tabella, la tabella viene visualizzata nell'interfaccia utente funzionalità ed è possibile usarla come tabella delle funzionalità.

Usare una tabella di streaming o una vista materializzata creata da una pipeline di tabelle live Delta come tabella delle funzionalità

Qualsiasi tabella di streaming o vista materializzata in Unity Catalog con una chiave primaria può essere una tabella delle funzionalità nel catalogo unity ed è possibile usare l'interfaccia utente delle funzionalità e l'API con la tabella.

Nota

  • Il supporto delle tabelle live delta per i vincoli di tabella è disponibile in anteprima pubblica. Gli esempi di codice seguenti devono essere eseguiti usando il canale di anteprima delle tabelle live Delta.
  • Solo il proprietario della tabella può dichiarare vincoli di chiave primaria. Il nome del proprietario viene visualizzato nella pagina dei dettagli della tabella di Esplora cataloghi.
  • Verificare che Progettazione funzionalità in Unity Catalog supporti il tipo di dati nella tabella Delta. Vedere Tipi di dati supportati.

Aggiungere una chiave primaria a una tabella di streaming o a una vista materializzata creata con SQL

Per impostare le chiavi primarie per una tabella di streaming esistente o una vista materializzata creata tramite l'interfaccia SQL delle tabelle live Delta, aggiornare lo schema della tabella di streaming o della vista materializzata nel notebook che gestisce l'oggetto. Aggiornare quindi la tabella per aggiornare l'oggetto Catalogo Unity.

Di seguito è riportata la sintassi per aggiungere una chiave primaria a una vista materializzata:

CREATE OR REFRESH MATERIALIZED VIEW existing_live_table(
  id int NOT NULL PRIMARY KEY,
  ...
) AS SELECT ...

Aggiungere la chiave primaria a una tabella di streaming o a una vista materializzata creata con Python

Per creare chiavi primarie per una tabella di streaming esistente o una vista materializzata creata da una pipeline di tabelle live Delta, è necessario usare l'interfaccia SQL delle tabelle live Delta, anche se la tabella di streaming o la vista materializzata è stata creata usando l'interfaccia Python di Tabelle Live Delta. Per aggiungere una chiave primaria a una tabella di streaming o a una vista materializzata creata in Python, creare un nuovo notebook SQL per definire una nuova tabella di streaming o una vista materializzata che legge dalla tabella di streaming o dalla vista materializzata esistente. Eseguire quindi il notebook come passaggio della pipeline Delta Live Tables esistente o in una nuova pipeline.

Di seguito è riportato un esempio della sintassi da usare nel nuovo notebook SQL per aggiungere una chiave primaria a una vista materializzata:

CREATE OR REFRESH MATERIALIZED VIEW new_live_table_with_constraint(
  id int NOT NULL PRIMARY KEY,
  ...
) AS SELECT * FROM existing_live_table

Controllare l'accesso alle tabelle delle funzionalità in Unity Catalog

Il controllo di accesso per le tabelle delle funzionalità nel catalogo unity è gestito dal catalogo unity. Vedere Privilegi del catalogo Unity.

Aggiornare una tabella delle funzionalità nel catalogo unity

È possibile aggiornare una tabella delle funzionalità nel catalogo unity aggiungendo nuove funzionalità o modificando righe specifiche in base alla chiave primaria.

I metadati della tabella delle funzionalità seguenti non devono essere aggiornati:

  • Chiave primaria.
  • Chiave di partizione.
  • Nome o tipo di dati di una funzionalità esistente.

La modifica di tali pipeline causerà l'interruzione delle pipeline downstream che usano funzionalità per il training e la gestione dei modelli.

Aggiungere nuove funzionalità a una tabella delle funzionalità esistente nel catalogo unity

È possibile aggiungere nuove funzionalità a una tabella delle funzionalità esistente in uno dei due modi seguenti:

  • Aggiornare la funzione di calcolo delle funzionalità esistente ed eseguire write_table con il dataframe restituito. Questo aggiorna lo schema della tabella delle funzionalità e unisce nuovi valori di funzionalità in base alla chiave primaria.
  • Creare una nuova funzione di calcolo delle funzionalità per calcolare i nuovi valori di funzionalità. Il dataframe restituito da questa nuova funzione di calcolo deve contenere le chiavi primarie e di partizione delle tabelle delle funzionalità ,se definite. Eseguire write_table con il dataframe per scrivere le nuove funzionalità nella tabella delle funzionalità esistente usando la stessa chiave primaria.

Aggiornare solo righe specifiche in una tabella delle funzionalità

Usare mode = "merge" in write_table. Le righe la cui chiave primaria non esiste nel dataframe inviato nella write_table chiamata rimangono invariate.

from databricks.feature_engineering import FeatureEngineeringClient
fe = FeatureEngineeringClient()
fe.write_table(
  name='ml.recommender_system.customer_features',
  df = customer_features_df,
  mode = 'merge'
)

Pianificare un processo per aggiornare una tabella delle funzionalità

Per garantire che le funzionalità nelle tabelle delle funzionalità abbiano sempre i valori più recenti, Databricks consiglia di creare un processo che esegue un notebook per aggiornare la tabella delle funzionalità a intervalli regolari, ad esempio ogni giorno. Se è già stato creato un processo non pianificato, è possibile convertirlo in un processo pianificato per assicurarsi che i valori delle funzionalità siano sempre aggiornati.

Il codice per aggiornare una tabella delle funzionalità usa mode='merge', come illustrato nell'esempio seguente.

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'
)

Archiviare i valori passati delle funzionalità giornaliere

Definire una tabella delle funzionalità con una chiave primaria composita. Includere la data nella chiave primaria. Ad esempio, per una tabella customer_featuresdelle funzionalità , è possibile usare una chiave primaria composita (date, customer_id) e una chiave date di partizione per letture efficienti.

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)
)
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'],
  partition_columns=['date'],
  schema=customer_features_df.schema,
  description='Customer features'
)

È quindi possibile creare codice da leggere dal filtro date della tabella delle funzionalità al periodo di tempo di interesse.

È anche possibile creare una tabella delle funzionalità della serie temporale che consente ricerche temporizzato quando si usa create_training_set o score_batch. Vedere Creare una tabella delle funzionalità nel catalogo unity.

Per mantenere aggiornata la tabella delle funzionalità, configurare un processo pianificato regolarmente per scrivere funzionalità o trasmettere nuovi valori delle funzionalità nella tabella delle funzionalità.

Creare una pipeline di calcolo delle funzionalità di streaming per aggiornare le funzionalità

Per creare una pipeline di calcolo delle funzionalità di streaming, passare un flusso DataFrame come argomento a write_table. Il metodo restituisce un oggetto StreamingQuery.

def compute_additional_customer_features(data):
  ''' Returns Streaming DataFrame
  '''
  pass

from databricks.feature_engineering import FeatureEngineeringClient
fe = FeatureEngineeringClient()

customer_transactions = spark.readStream.load("dbfs:/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'
)

Leggere da una tabella delle funzionalità nel catalogo unity

Usare read_table per leggere i valori delle funzionalità.

from databricks.feature_engineering import FeatureEngineeringClient
fe = FeatureEngineeringClient()
customer_features_df = fe.read_table(
  name='ml.recommender_system.customer_features',
)

Cercare ed esplorare le tabelle delle funzionalità nel catalogo unity

Usare l'interfaccia utente delle funzionalità per cercare o esplorare le tabelle delle funzionalità nel catalogo unity.

  1. Fare clic su Icona archivio funzionalitàFunzionalità nella barra laterale per visualizzare l'interfaccia utente funzionalità.

  2. Selezionare il catalogo con il selettore di catalogo per visualizzare tutte le tabelle delle funzionalità disponibili in tale catalogo. Nella casella di ricerca immettere tutto o parte del nome di una tabella di funzionalità, di una funzionalità o di un commento. È anche possibile immettere tutto o parte della chiave o del valore di un tag. Il testo di ricerca non fa distinzione tra maiuscole e minuscole.

    Esempio di ricerca delle funzionalità

Ottenere i metadati delle tabelle delle funzionalità nel catalogo unity

Usare get_table per ottenere i metadati della tabella delle funzionalità.

from databricks.feature_engineering import FeatureEngineeringClient
fe = FeatureEngineeringClient()
ft = fe.get_table(name="ml.recommender_system.user_feature_table")
print(ft.features)

Usare tag con tabelle e funzionalità delle funzionalità in Unity Catalog

È possibile usare tag, che sono semplici coppie chiave-valore, per classificare e gestire le tabelle e le funzionalità delle funzionalità.

Per le tabelle delle funzionalità, è possibile creare, modificare ed eliminare tag usando l'interfaccia utente di Esplora cataloghi, Databricks SQL o l'API Python di progettazione delle funzionalità.

Per le funzionalità, è possibile creare, modificare ed eliminare tag usando l'interfaccia utente di Esplora cataloghi o Databricks SQL.

L'esempio seguente illustra come usare l'API Python di progettazione delle funzionalità per creare, aggiornare ed eliminare tag di tabella delle funzionalità.

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")

Eliminare una tabella delle funzionalità nel catalogo unity

È possibile eliminare una tabella delle funzionalità nel catalogo unity eliminando direttamente la tabella Delta nel catalogo Unity usando Esplora cataloghi o l'API Python di progettazione delle funzionalità.

Nota

  • L'eliminazione di una tabella di funzionalità può causare errori imprevisti nei producer upstream e nei consumer downstream (modelli, endpoint e processi pianificati). È necessario eliminare gli archivi online pubblicati con il provider di servizi cloud.
  • Quando si elimina una tabella delle funzionalità nel catalogo unity, viene eliminata anche la tabella Delta sottostante.
  • drop_table non è supportato in Databricks Runtime 13.1 ML o versione successiva. Usare il comando SQL per eliminare la tabella.

È possibile usare Databricks SQL o FeatureEngineeringClient.drop_table per eliminare una tabella delle funzionalità nel catalogo unity:

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'
)