Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Important
Ez a funkció nyilvános előzetes verzióban van. A munkaterület rendszergazdái az Előnézetek lapon szabályozhatják a funkcióhoz való hozzáférést. Lásd: Az Azure Databricks előzetes verziójának kezelése.
Hozzáférés-kezelés
A funkciók szabályozható Unity Catalog-objektumok. A szolgáltatáshoz való hozzáférést a CREATE FEATUREUnity READ FEATUREMANAGE Catalog jogosultságai vezérlik. A teljes leírásért tekintse meg a Unity Catalog jogosultságokra vonatkozó hivatkozását.
-
CREATE FEATURE— Szolgáltatás létrehozásához szükséges egy sémában.create_featureésregister_featurea szülőséma megköveteléseCREATE FEATURE. A minimális jogosultság elvét követve adja megCREATE FEATUREa sémaszinten; egy katalógusban is megadhatja, hogy a katalógus bármely sémájában létre lehessen hozni a szolgáltatásokat. -
READ FEATURE— Egy funkció és adatainak olvasásához szükséges.get_feature,create_training_setés a materializált funkciók adatainak betanításhoz vagy kiszolgáláshoz való olvasása megköveteliREAD FEATUREa funkciót.READ FEATUREa sémán vagy katalóguson megadott összes jelenlegi és jövőbeli funkcióra vonatkozik. -
MANAGE— Egy szolgáltatás életciklusának és támogatásainak kezeléséhez szükséges. Egy funkció törlése a funkcióvaldelete_feature, és egy funkció megvalósítása a szolgáltatássalmaterialize_featuresMANAGEvagydelete_materialized_featureazzal együtt.
Minden funkcióművelethez szükség van USE CATALOG a szülőkatalógusra és USE SCHEMA a szülősémára is. A materializálás módjáról MANAGE és READ FEATURE alkalmazásáról az Engedélyek című témakörben olvashat.
Funkciónézet API
Feature konstruktor és register_feature()
Az ajánlott módszer egy Feature objektum helyi létrehozása és a register_feature Unity Catalogban való megőrzése. Ez a kétlépéses munkafolyamat lehetővé teszi, hogy a regisztráció előtt kísérletezzen a funkciókkal (beleértve azokat is create_training_set).
Feature(
source: DataSource, # Required: DeltaTableSource, StreamSource, or RequestSource
function: Union[AggregationFunction, ColumnSelection], # Required: Aggregation or column selection
entity: Optional[List[str]] = None, # Required for aggregation: entity columns
timeseries_column: Optional[str] = None, # Required for aggregation: timestamp column
name: Optional[str] = None, # Optional: Feature name (auto-generated if omitted)
description: Optional[str] = None, # Optional: Feature description
)
FeatureEngineeringClient.register_feature() regisztrál egy helyileg létrehozott egységet Feature a Unity Catalogban.
FeatureEngineeringClient.register_feature(
feature: Feature, # Required: A Feature instance (not already registered)
catalog_name: str, # Required: UC catalog name
schema_name: str, # Required: UC schema name
) -> Feature
from databricks.feature_engineering.entities import Feature, DeltaTableSource, AggregationFunction, Sum, RollingWindow
from datetime import timedelta
# Step 1: Construct the feature locally
feature = Feature(
source=DeltaTableSource(catalog_name="main", schema_name="store", table_name="transactions"),
entity=["user_id"],
timeseries_column="transaction_time",
function=AggregationFunction(Sum(input="amount"), RollingWindow(window_duration=timedelta(days=7))),
)
# Step 2: Register in Unity Catalog
fe = FeatureEngineeringClient()
registered_feature = fe.register_feature(
feature=feature,
catalog_name="main",
schema_name="store",
)
create_feature()
FeatureEngineeringClient.create_feature() egyetlen lépésben ellenőrzi, felépíti és azonnal regisztrálja a funkciót a Unity Katalógusban. Ezt akkor használja, ha nem kell helyileg kísérleteznie a funkcióval.
FeatureEngineeringClient.create_feature(
source: DataSource, # Required: DeltaTableSource, StreamSource, or RequestSource
function: Union[AggregationFunction, ColumnSelection], # Required: Aggregation or column selection
catalog_name: str, # Required: The catalog name for the feature
schema_name: str, # Required: The schema name for the feature
entity: Optional[List[str]] = None, # Required for aggregation: entity columns
timeseries_column: Optional[str] = None, # Required for aggregation: timestamp column
name: Optional[str] = None, # Optional: Feature name (auto-generated if omitted)
description: Optional[str] = None, # Optional: Feature description
) -> Feature
Paraméterek:
-
source: A funkciószámításban (DeltaTableSourcevagyStreamSourceRequestSource) használt adatforrás. -
function: AzAggregationFunctionoperátort (példáulSum(input="amount")), a bemeneti oszlopot és az időablakot összecsomagolva. VagyColumnSelection("column_name")átmenő funkciókhoz. -
catalog_name: A funkció Unity Catalog-katalógusának neve. -
schema_name: A funkció Unity Catalog-sémaneve. -
entity: Az összesítési szintet (elsődleges kulcsokat) meghatározó oszlopnevek listája. Az összesítési funkciókhoz szükséges. Például["user_id"]a felhasználónkénti összesítések. -
timeseries_column: Az időablak-összesítéshez használt időbélyeg-oszlop. Az összesítési funkciókhoz szükséges. -
name: Választható funkciónév. Ha nincs megadva, automatikusan létrejön a bemeneti oszlopból, függvényből és ablakból (példáulamount_avg_rolling_7d). -
description: A funkció opcionális leírása.
Visszatér: Érvényesített funkciópéldány
Felveti: ValueError, ha bármelyik ellenőrzés sikertelen
delete_feature()
Egy funkció törlése a Unity Katalógusból a teljes név alapján.
FeatureEngineeringClient.delete_feature(
full_name: str, # Required: '<catalog>.<schema>.<feature_name>'
) -> None
fe.delete_feature(full_name="main.store.amount_sum_rolling_7d")
A szolgáltatás törlése előtt távolítsa el vagy frissítse az arra hivatkozó modelleket vagy szolgáltatásjellemzőket. Ha a funkció materializált, először törölje a materializált funkciót. Tekintse meg a materializált funkciók törlését ismertető témakört.
Automatikusan létrehozott nevek
Ha name nincs megadva, a rendszer automatikusan létrehoz egy nevet. A létrehozott nevek a következő mintát követik: {column}_{function}_{window}. Például:
-
price_avg_rolling_1h(1 órás átlagos ár) -
transaction_count_rolling_30d_1d(30 napos tranzakciószám az esemény időbélyegétől számított 1d késleltetéssel)
Támogatott függvények
Összesítő függvények
Megjegyzés:
Az aggregációs függvények az AggregationFunction leírtak szerint egy időablakba vannak csomagolva. Minden függvény egy paramétert input használ, amely megadja a forrásoszlopot az összesítéshez.
| Function | Description | Példa használati esetre |
|---|---|---|
Sum(input="column") |
Értékek összesen | Felhasználónkénti napi alkalmazáshasználat percekben |
Avg(input="column") |
Értékek átlaga | Átlagos tranzakció összege |
Count(input="column") |
Rekordok száma | Bejelentkezések száma felhasználónként |
Min(input="column") |
Minimális érték | Hordható eszköz által rögzített legalacsonyabb pulzusszám |
Max(input="column") |
Maximális érték | A legmagasabb tranzakciómennyiség munkamenetenként |
StddevPop(input="column") |
Populáció szórása | Napi tranzakcióösszegek variabilitása az összes ügyfél között |
StddevSamp(input="column") |
Minta szórása | A hirdetéskampány kattintási sebességének variabilitása |
VarPop(input="column") |
Sokaság varianciája | Érzékelő-olvasások terjedése IoT-eszközökhöz egy gyárban |
VarSamp(input="column") |
Mintavariancia | Filmbesorolások eloszlása mintául szolgáló csoportban |
ApproxCountDistinct(input="column", relativeSD=0.05) |
Közelítő egyedi darabszám | A megvásárolt elemek eltérő száma |
ApproxPercentile(input="column", percentile=0.95, accuracy=100) |
Hozzávetőleges percentilis | p95-válasz késése |
First(input="column") |
Első érték | Első bejelentkezési időbélyeg |
Last(input="column") |
Utolsó érték | Legutóbbi vásárlás összege |
ColumnSelection (átmenő)
ColumnSelection egyetlen oszlopot jelöl ki egy forrásból összesítés alkalmazása nélkül. Közvetlenül a function paraméterbe van csomagolva (nem belül AggregationFunction). A visszatérési típus a forrássémából származik.
| Function | Description | Példa használati esetre |
|---|---|---|
ColumnSelection("col") |
Oszlop legújabb értéke (összesítés nélkül) | Legutóbbi szállítói kategória, kérelemmező átadása |
ColumnSelection bármilyen adatforrással használható:
-
DeltaTableSource: Az entitáskulcsonkénti legújabb értéket adja vissza egy időponthoz kötött illesztéssel (nincs visszatekintő ablak összesítése). -
StreamSource: Az entitáskulcsonkénti legújabb értéket adja vissza a streamből (nincs visszatekintő ablak összesítése). -
RequestSource: A következtetési időpontban megadott értéket adja át (vagy a betanításkor kinyeri a címkézett DataFrame-ből).
from databricks.feature_engineering.entities import (
ColumnSelection, DeltaTableSource, Feature, FieldDefinition,
RequestSource, ScalarDataType,
)
delta_source = DeltaTableSource(
catalog_name="main", schema_name="feature_store", table_name="transactions",
)
request_source = RequestSource(
schema=[
FieldDefinition(name="session_duration", data_type=ScalarDataType.DOUBLE),
]
)
# ColumnSelection from a Delta table
latest_amount = Feature(
source=delta_source,
function=ColumnSelection("amount"),
entity=["user_id"],
timeseries_column="transaction_time",
name="latest_transaction_amount",
)
# ColumnSelection from a RequestSource
session_feature = Feature(
source=request_source,
function=ColumnSelection("session_duration"),
name="session_duration",
)
Példa: összesítési és oszlopkijelölési funkciók
Az alábbi példa az ugyanazon adatforráson definiált funkciókat mutatja be.
from databricks.feature_engineering.entities import (
AggregationFunction, Feature, Sum, Avg, ApproxCountDistinct,
ColumnSelection, RollingWindow,
)
from datetime import timedelta
window = RollingWindow(window_duration=timedelta(days=7))
sum_feature = Feature(
source=source,
entity=["user_id"],
timeseries_column="event_time",
function=AggregationFunction(Sum(input="amount"), window),
)
avg_feature = Feature(
source=source,
entity=["user_id"],
timeseries_column="event_time",
function=AggregationFunction(Avg(input="amount"), window),
)
distinct_count = Feature(
source=source,
entity=["user_id"],
timeseries_column="event_time",
function=AggregationFunction(ApproxCountDistinct(input="product_id", relativeSD=0.01), window),
)
# Column selection (no aggregation, no time window)
latest_amount = Feature(
source=source,
function=ColumnSelection("amount"),
entity=["user_id"],
timeseries_column="event_time",
name="latest_amount",
)
Szűrési feltételekkel rendelkező funkciók
A filter_condition paraméter lehetővé teszi a sorok szűrését a forrástáblából az összesítések kiszámítása előtt . Ez az adatok csoportosítása és összesítése előtt alkalmazott SQL-záradékként WHERE működik.
Megjegyzés:
filter_conditionaz összesítés előtt szűri a sorokat, például egy korábban WHEREalkalmazott SQL-záradékotGROUP BY. Nem változtatja meg a részletességet, amelyet mindig a funkciódefiníció határoz meg entity .
A szűrők akkor hasznosak, ha nagy méretű forrástáblákkal dolgoznak, amelyek a funkciószámításhoz szükséges adatok szuperhalmazát tartalmazzák, és minimálisra csökkentik a különálló nézetek létrehozásának szükségességét ezen táblák tetején.
from databricks.feature_engineering.entities import AggregationFunction, Sum, Count, RollingWindow, DeltaTableSource
from datetime import timedelta
# Source with filter applied at the source level
high_value_transactions = DeltaTableSource(
catalog_name="main",
schema_name="ecommerce",
table_name="transactions",
filter_condition="amount > 100", # Only transactions over $100
)
high_value_sales = Feature(
source=high_value_transactions,
entity=["user_id"],
timeseries_column="transaction_time",
function=AggregationFunction(Sum(input="amount"), RollingWindow(window_duration=timedelta(days=30))),
)
# Multiple conditions
completed_orders_source = DeltaTableSource(
catalog_name="main",
schema_name="ecommerce",
table_name="orders",
filter_condition="status = 'completed' AND payment_method = 'credit_card'",
)
completed_orders = Feature(
source=completed_orders_source,
entity=["user_id"],
timeseries_column="order_time",
function=AggregationFunction(Count(input="order_id"), RollingWindow(window_duration=timedelta(days=7))),
)
# Filter on a StreamSource
from databricks.feature_engineering.entities import StreamSource
purchase_stream = StreamSource(
full_name="main.ecommerce.transactions_stream",
filter_condition="value.event_type = 'purchase'",
)
purchase_total = Feature(
source=purchase_stream,
entity=["value.user_id"],
timeseries_column="value.event_time",
function=AggregationFunction(Sum(input="value.amount"), RollingWindow(window_duration=timedelta(hours=1))),
)
Adatforrások
DeltaTableSource
DeltaTableSource egy rövid ideig Python objektum, amellyel meghatározható, hogyan számíthatók ki a szolgáltatások a forrástáblából. Nem hoz létre új táblát. Megadja az adatok olvasásának és a funkciók összesítésének konfigurációját.
DeltaTableSource(
catalog_name: str, # Required: Catalog name
schema_name: str, # Required: Schema name
table_name: str, # Required: Table name
filter_condition: Optional[str] = None, # Optional: SQL WHERE clause to filter source data
transformation_sql: Optional[str] = None, # Optional: SQL SELECT expression for column transformations
dataframe_schema: Optional[str] = None, # Required if transformation_sql is set: schema of the resulting DataFrame
)
Paraméterek:
-
catalog_name, ,schema_nametable_name: Azonosítsa a forrás Delta táblát a Unity Catalogban. -
filter_condition: Az összesítés előtt alkalmazott SQL-záradékWHERE. Példa:"status = 'completed'". -
transformation_sql: A forrástáblára alkalmazott SQL-kifejezésSELECT. Ezzel az összesítés előtt átnevezheti az oszlopokat, az öntött típusokat vagy a számítási származtatott oszlopokat. Ha nincs megadva, az összes oszlop ki van jelölve (*). Példa:"user_id, CAST(amount AS DOUBLE) AS amount, event_time". -
dataframe_schema: Az eredményként kapott DataFrame sémája átalakítások után, Spark StructType JSON formátumban (forrás).df.schema.json()Kötelező, hatransformation_sqlmeg van adva. Ez jelzi a rendszernek az átalakításból eredő oszlopneveket és típusokat.
Ha mindkettő filter_conditiontransformation_sql be van állítva, az eredmény a következő lesz: SELECT {transformation_sql} FROM {table} WHERE {filter_condition}.
Megjegyzés:
A timeseries_column (a funkciódefinícióban megadott, nem pedig a DeltaTableSource) típusnak TimestampType vagy DateTypetípusnak kell lennie. Az egész számtípusok működhetnek, de az időablak-aggregátumok pontosságának csökkenését okozhatják.
Példa: Oszlopátalakítások használata transformation_sql
source = DeltaTableSource(
catalog_name="main",
schema_name="analytics",
table_name="raw_events",
transformation_sql="user_id, CAST(price_cents AS DOUBLE) / 100 AS price, event_time",
filter_condition="event_type = 'purchase'",
dataframe_schema=spark.sql(
"SELECT user_id, CAST(price_cents AS DOUBLE) / 100 AS price, event_time FROM main.analytics.raw_events LIMIT 0"
).schema.json(),
)
Példa: PySpark DataFrame származtatása transformation_sql és dataframe_schema származtatása
Az átalakítást PySpark-lekérdezésként is megírhatja, majd kinyerheti a sémát az eredményként kapott DataFrame-ből:
df = spark.sql(f"""
SELECT user_id, CAST(amount AS DOUBLE) / 100 AS amount_dollars, event_time
FROM main.analytics.events
WHERE event_date >= date_sub(current_date(), 7)
LIMIT 0
""")
# Use df.schema.json() as the dataframe_schema
source = DeltaTableSource(
catalog_name="main",
schema_name="analytics",
table_name="events",
transformation_sql="user_id, CAST(amount AS DOUBLE) / 100 AS amount_dollars, event_time",
filter_condition="event_date >= date_sub(current_date(), 7)",
dataframe_schema=df.schema.json(),
)
Megjegyzés:
transformation_sql csak a sorszintű kifejezéseket támogatja (oszlop átnevezése, leadása, számtani). Az aggregációs függvények támogatottak COUNT(*) vagy SUM() nem támogatottak. Használja AggregationFunction inkább a funkciódefiníción.
DeltaTableSource.from_sql()
Kényelmesen létrehozhat egy DeltaTableSource SQL-lekérdezést. A metódus elemzi a lekérdezést, hogy automatikusan kinyerje a tábla nevét, transformation_sqlés filter_condition.
DeltaTableSource.from_sql(
sql: str, # Required: SQL SELECT query
spark: SparkSession, # Required: active SparkSession (for schema inference)
) -> DeltaTableSource
Csak az egyszerű SELECT ... FROM ... [WHERE ...] lekérdezések támogatottak. A rendszer elutasítja az összetett SQL-eket (JOIN-eket, alquerieseket, CTE-ket, UNION-okat). Összetett lekérdezések esetén közvetlenül DeltaTableSource az és transformation_sqla filter_condition .
from databricks.feature_engineering.entities import (
AggregationFunction,
DeltaTableSource,
Feature,
Sum,
TumblingWindow,
)
source = DeltaTableSource.from_sql(
spark=spark,
sql=f"SELECT customer_id, event_ts, amount * 2 AS doubled_amount, amount FROM {CATALOG}.{SCHEMA}.{TABLE}",
)
feature = Feature(
source=source,
function=AggregationFunction(Sum(input="doubled_amount"), time_window=TumblingWindow(window_duration=timedelta(days=7))),
entity=["customer_id"], timeseries_column="event_ts",
)
Iterálás a to_dataframe()
A funkciószámításhoz használt adatok előnézetének megtekintésére szolgál source.to_dataframe() . Ez akkor hasznos, ha az iterálás után filter_condition és transformation_sql a várt eredmény eléréséig tart.
source = DeltaTableSource(
catalog_name="main",
schema_name="analytics",
table_name="events",
filter_condition="event_type = 'purchase'",
)
# Preview the filtered source data
source.to_dataframe().display()
Az entitások ismertetése
Az entitásoszlopok határozzák meg a funkciók összesítési szintjét. Ezek a Feature definícióban vannak megadva, nem a következőn DeltaTableSource: . Az entitások a következőt határozzák meg:
-
Az adatok csoportosítása: A funkciók az entitásértékek egyedi kombinációja alapján vannak összesítve (az SQL-hez
GROUP BYhasonlóan) - Az elsődleges kulcsstruktúra: Minden egyedi entitáskombináció egy sor számítási funkciót eredményez
Példa: Ügyfélszintű funkciók
Az alábbi kód az ügyfél szintjén összesíti a funkciókat (ügyfélenként egy sort):
from databricks.feature_engineering.entities import DeltaTableSource
source = DeltaTableSource(
catalog_name="main",
schema_name="analytics",
table_name="user_events",
)
Feature(
source=source,
entity=["user_id"], # Features aggregated per user
timeseries_column="event_time", # Timestamp for time windows
function=AggregationFunction(Sum(input="amount"), RollingWindow(window_duration=timedelta(days=7))),
)
Példa: Ügyfél-áruház szintű funkciók
Ha részletesebb szinten szeretné összesíteni a funkciókat (ügyfél-áruház kombinációnként egy sort), használjon több entitásoszlopot:
source = DeltaTableSource(
catalog_name="main",
schema_name="retail",
table_name="transactions",
)
Feature(
source=source,
entity=["user_id", "store_id"], # Features aggregated per user-store pair
timeseries_column="transaction_time",
function=AggregationFunction(Sum(input="amount"), RollingWindow(window_duration=timedelta(days=7))),
)
Ha az összesítés különböző szintjein (például ügyfélszintű és ügyfélszintű) funkciókra van szüksége, használjon különböző entity értékeket a funkciódefiníciókban. Ugyanez DeltaTableSource megosztható a különböző entitáskonfigurációkkal rendelkező funkciók között.
StreamSource
StreamSource egy Streamre hivatkozik. A Stream a streamforrás kapcsolati, hitelesítési, séma- és betöltési konfigurációját tartalmazza. A Kafka esetében a funkciódefiníciókban szereplő oszlophivatkozásokat előtaggal value. kell megadni, vagy key. meg kell jelölni, hogy az üzenet melyik részét kell elolvasni.
StreamSource(
full_name: str, # Required: Three-part Stream name (catalog.schema.stream)
filter_condition: Optional[str], # Optional: SQL WHERE clause applied before aggregation
)
Paraméterek:
-
full_name: A Stream teljes háromrészes neve (például"my_catalog.my_schema.my_stream"). -
filter_condition(nem kötelező): Az adatok összesítés előtti adatfolyamára alkalmazott SQL-záradékWHEREpontelőtagú oszlophivatkozások használatával (például"value.event_type = 'purchase'").
from databricks.feature_engineering.entities import StreamSource
stream_source = StreamSource(
full_name="my_catalog.my_schema.my_stream",
filter_condition="value.event_type = 'purchase'",
)
RequestSource
RequestSource A kérelem hasznos adataiban következtetési időben megadott adatok sémáját határozza meg, nem pedig előre materializált táblából való megkeresést. A betanítás során a rendszer kinyeri ezeket az oszlopokat a címkézett DataFrame-ből create_training_set. A modell kiszolgálása során a hívónak tartalmaznia kell őket a HTTP-kérés hasznos adatai között.
RequestSource
ColumnSelection használatával (közvetlenül egy érték átengedéséhez). Nem támogatja az összesítő függvényeket és az időablakokat.
A séma meghatározása
Adja meg a sémát objektumok listájáként FieldDefinition , mindegyikben egy oszlopnevet és egy ScalarDataType:
from databricks.feature_engineering.entities import (
FieldDefinition, RequestSource, ScalarDataType,
)
request_source = RequestSource(
schema=[
FieldDefinition(name="transaction_amount", data_type=ScalarDataType.DOUBLE),
FieldDefinition(name="vendor_id", data_type=ScalarDataType.STRING),
FieldDefinition(name="transaction_id", data_type=ScalarDataType.STRING),
FieldDefinition(name="transaction_time", data_type=ScalarDataType.DATE),
]
)
Támogatott adattípusok
RequestSourcetámogatja a következőben ScalarDataTypedefiniált skaláris típusokat: INTEGER, FLOAT, , BOOLEAN, STRINGDOUBLELONG, . TIMESTAMPDATESHORT Az olyan összetett típusok, mint a tömbök, a térképek és a szerkezetek nem támogatottak.
A kérelemadatok hidratált állapota
| Context | Magatartás |
|---|---|
Oktatás (create_training_set) |
A rendszer kinyeri az oszlopokat a címkézett DataFrame-ből. A típusok a deklarált sémán vannak érvényesítve. Az eltérések hibát jeleznek (implicit öntés nélkül). |
| Kiszolgáló (modellvégpont) | A rendszer lekéri az oszlopokat a HTTP-kérelemből dataframe_records vagy dataframe_split a http-kérelemben. A JSON-értékeket a deklarált típusok (például JSON-szám →) öntötték DOUBLE. |
Modell aláírása
Ha egy modellt funkciókkal rendelkező log_model betanítási készlettel naplóznakRequestSource, a rendszer kötelező bemenetként hozzáadja az RequestSource oszlopokat az MLflow-modell aláírásához. Ez azt jelenti, hogy a kiszolgáló végpont API-sémája tükrözi, hogy a hívóknak milyen mezőket kell megadniuk következtetési időpontban.
Betanítási és következtetési API
create_training_set()
Létrehoz egy betanítási adatkészletet az időponthoz kötött helyes funkciószámítással. További információ: Modellek betanítása funkciónézetekkel.
FeatureEngineeringClient.create_training_set(
df: DataFrame, # DataFrame with training data
features: Optional[List[Feature]], # List of Feature objects
label: Union[str, List[str], None], # Label column name(s)
exclude_columns: Optional[List[str]] = None, # Optional: columns to exclude
) -> TrainingSet
log_model()
Naplóz egy modellt a szolgáltatás metaadataival a leállás nyomon követéséhez és az automatikus funkciókereséshez a következtetés során. További információ: Modellek betanítása funkciónézetekkel.
FeatureEngineeringClient.log_model(
model, # Trained model object
artifact_path: str, # Path to store model artifact
flavor: ModuleType, # MLflow flavor module (e.g., mlflow.sklearn)
training_set: TrainingSet, # TrainingSet used for training
registered_model_name: Optional[str], # Optional: register model in Unity Catalog
)
score_batch()
Offline kötegelt következtetést hajt végre automatikus funkciókereséssel. A modellben tárolt szolgáltatás-metaadatok használatával pontos funkciókat számít ki, biztosítva a betanítással való konzisztenciát.
FeatureEngineeringClient.score_batch(
model_uri: str, # URI of logged model (e.g., "models:/catalog.schema.model/1")
df: DataFrame, # DataFrame with entity keys and timestamps
) -> DataFrame
A bemeneti DataFrame-nek tartalmaznia kell a betanítás során használt entitás- és idősoroszlopokat. A rendszer automatikusan kiszámítja a funkciókat a forrásadatokból.
fe = FeatureEngineeringClient()
# Batch scoring with automatic feature lookup
predictions = fe.score_batch(
model_uri="models:/main.ecommerce.fraud_model/1",
df=inference_df,
)
predictions.display()
Időablakok
A funkciónézetek három különböző ablaktípust támogatnak az időablak-alapú összesítések visszatekintési viselkedésének szabályozásához: gördülés, csúszás és csúszás.
- A gördülő ablakok visszatekintenek az esemény idejéből. Az időtartam és a késés explicit módon van meghatározva.
- A csúszó ablakok rögzítettek, átfedésmentes időablakok. Minden adatpont pontosan egy ablakhoz tartozik.
- A tolóablakok átfedésben vannak, a gördülő időablakok konfigurálható diaintervallummal.
Az alábbi ábra bemutatja, hogyan működnek.
Gördülő ablak
Megjegyzés:
RollingWindow korábban el lett nevezve ContinuousWindow. Ha egy korábbi SDK-verzióról migrál, ennek megfelelően frissítse az importálást.
A gördülő ablakok up-todátum- és valós idejű összesítések, amelyek általában streamelési adatokon keresztül használhatók. A streamelési folyamatokban a gördülő ablak csak akkor bocsát ki új sort, ha a rögzített hosszúságú ablak tartalma megváltozik, például amikor egy esemény belép vagy távozik. Ha egy gördülőablak-funkciót használnak a betanítási folyamatokban, a rendszer pontos időponthoz kötött funkciószámítást végez a forrásadatokon az adott esemény időbélyegét közvetlenül megelőző rögzített hosszúságú időtartam használatával. Ez segít megelőzni az online kapcsolat nélküli eltérést vagy az adatszivárgást. Az időponthoz kapcsolódó T funkciók összesítik az eseményeket [T − időtartam, T).
class RollingWindow(TimeWindow):
window_duration: datetime.timedelta
delay: Optional[datetime.timedelta] = None
Az alábbi táblázat egy gördülő ablak paramétereit sorolja fel. Az ablak kezdési és befejezési ideje az alábbi paramétereken alapul:
- Kezdési idő:
evaluation_time - window_duration - delay(beleértve) - Befejezési idő:
evaluation_time - delay(kizárólagos)
| Paraméter | Constraints |
|---|---|
delay (nem kötelező) |
0 ≥ kell lennie (az ablakot visszafelé kell mozgatni az időbélyegről). Az delay esemény létrehozása és az esemény időbélyege közötti rendszerkésések figyelembe vétele a betanítási adathalmazokba való jövőbeli eseményszivárgás megakadályozása érdekében. Ha például egy perc késés van az események létrehozása között, és ezek az események végül egy forrástáblába kerülnek, ahol időbélyeget rendelnek hozzájuk, akkor a késés az lesz timedelta(minutes=1). |
window_duration |
0-nak kell lennie > |
from databricks.feature_engineering.entities import RollingWindow
from datetime import timedelta
# Look back 7 days from evaluation time
window = RollingWindow(window_duration=timedelta(days=7))
Az alábbi kód használatával határozzon meg egy gördülő ablakot késleltetéssel.
# Look back 7 days, offset by 1 minute to account for data ingestion delay
window = RollingWindow(
window_duration=timedelta(days=7),
delay=timedelta(minutes=1)
)
Példák a gördülő ablakra
window_duration=timedelta(days=7): Ez egy 7 napos visszatekintési ablakot hoz létre, amely az aktuális kiértékelési időpontban fejeződik be. A 7. napon 14:00-kor kezdődő esemény esetén ez magában foglalja az összes eseményt a 0. napon 14:00 órától a 7. napon 14:00-ig, de ezt az időpontot nem beleértve.window_duration=timedelta(hours=1), delay=timedelta(minutes=30): Ez egy 1 órás visszatekintési ablakot hoz létre, amely 30 perccel a kiértékelési idő előtt ér véget. Egy 15:00-kor kezdődő esemény esetén ez magában foglalja az összes eseményt 13:30-tól egészen (de nem beleértve) 14:30-ig. Ez hasznos az adatbetöltési késések figyelembe vételéhez.
Csúszó ablak
Az időt átfedésmentesen felosztó, fix hosszúságú ablakkal definiált funkciók esetében az aggregációk előre meghatározott időtartamú ablakokra vonatkoznak, amelyek egy csúszási intervallummal lépnek tovább. Ennek eredményeképpen a forrás minden eseménye pontosan egy ablakhoz járul hozzá. Az t időpontnál a funkciók összesítik az adatokat az olyan ablakokból, amelyek t előtt végződnek (kizárva). A Windows a Unix-korszaktól indul.
class TumblingWindow(TimeWindow):
window_duration: datetime.timedelta
Az alábbi táblázat egy gördülő ablak paramétereit sorolja fel.
| Paraméter | Constraints |
|---|---|
window_duration |
0-nak kell lennie > |
from databricks.feature_engineering.entities import TumblingWindow
from datetime import timedelta
window = TumblingWindow(
window_duration=timedelta(days=7)
)
Guruló ablak példa
-
window_duration=timedelta(days=5): Ez előre meghatározott rögzített hosszúságú, egyenként 5 napos ablakokat hoz létre. Példa: Az 1. ablak a 0. naptól a 4. napig, a 2. ablak az 5. naptól a 9. napig, a 3. ablak a 10. naptól a 14. napig terjed stb. Az 1. ablak az összes olyan eseményt tartalmazza, amelynek időbélyegei a 0. napon kezdődnek00:00:00.00, legfeljebb (de nem beleértve) az 5. napon beállított időbélyeggel00:00:00.00rendelkező eseményeket. Minden esemény pontosan egy ablakhoz tartozik.
Csúszó ablak
A tolóablakokkal definiált funkciók esetében az aggregációk egy előre meghatározott rögzített hosszúságú ablakban vannak kiszámítva, amely egy diaintervallummal halad előre, átfedésben lévő ablakokat hozva létre. A forrás minden eseménye hozzájárulhat több ablak funkcióösszesítéséhez. Az t időpontnál a funkciók összesítik az adatokat az olyan ablakokból, amelyek t előtt végződnek (kizárva). A Windows a Unix-korszaktól indul.
class SlidingWindow(TimeWindow):
window_duration: datetime.timedelta
slide_duration: datetime.timedelta
Az alábbi táblázat egy tolóablak paramétereit sorolja fel.
| Paraméter | Constraints |
|---|---|
window_duration |
0-nak kell lennie > |
slide_duration |
0 és ><window_duration |
from databricks.feature_engineering.entities import SlidingWindow
from datetime import timedelta
window = SlidingWindow(
window_duration=timedelta(days=7),
slide_duration=timedelta(days=1)
)
CSúszóablak példa
-
window_duration=timedelta(days=5), slide_duration=timedelta(days=1): Ez átfedésben lévő 5 napos ablakokat hoz létre, amelyek minden alkalommal 1 nappal haladnak előre. Példa: Az 1. ablak a 0. naptól a 4. napig, a 2. ablak az 1. naptól az 5. napig, a 3. ablak a 2. naptól a 6. napig terjed stb. Minden ablak tartalmazza az eseményeket a kezdő naptól00:00:00.00a záró napig (de nem beleértve)00:00:00.00is. Mivel az ablakok átfedésben vannak, egyetlen esemény több ablakhoz is tartozhat (ebben a példában minden esemény legfeljebb 5 különböző ablakhoz tartozik).
Materializálási triggerek
Aktiválja a materializálási folyamat futásának vezérlését. Az eseményindító típusa a funkció típusától függ.
CronSchedule
Összesítési funkciókhoz használható CronSchedule (AggregationFunction). A folyamat egy quartz cron kifejezés által meghatározott rögzített ütemezésen fut.
from databricks.feature_engineering.entities import CronSchedule
trigger = CronSchedule(
quartz_cron_expression="0 0 * * * ?", # Hourly
timezone_id="UTC",
)
TableTrigger
Olyan funkciókhoz használható TableTrigger , ColumnSelection amelyeket egy DeltaTableSource. A folyamat akkor fut, amikor a felsőbb rétegbeli Delta-tábla új véglegesítést kap.
from databricks.feature_engineering.entities import TableTrigger
trigger = TableTrigger()
StreamingMode
Olyan funkciókhoz használható StreamingMode , amelyeket egy StreamSource. A folyamat folyamatos streamelési folyamatként fut.
from databricks.feature_engineering import FeatureEngineeringClient
from databricks.feature_engineering.entities import (
StreamSource, Feature, AggregationFunction, Sum,
RollingWindow, OnlineStoreConfig, StreamingMode,
)
from datetime import timedelta
fe = FeatureEngineeringClient()
stream_source = StreamSource(full_name="my_catalog.my_schema.my_stream")
streaming_feature = fe.create_feature(
source=stream_source,
entity=["value.user_id"],
timeseries_column="value.event_time",
function=AggregationFunction(
operator=Sum(input="value.amount"),
time_window=RollingWindow(window_duration=timedelta(hours=1)),
),
catalog_name="my_catalog",
schema_name="my_schema",
name="user_purchase_sum",
)
fe.materialize_features(
features=[streaming_feature],
online_config=OnlineStoreConfig(
catalog_name="my_catalog",
schema_name="my_schema",
table_name_prefix="streaming_features_serving",
online_store_name="feature_store_online",
),
trigger=StreamingMode(),
)
Eseményindító kiválasztása
| Szolgáltatás típusa | Kiváltó | Futtatáskor |
|---|---|---|
Összesítés (AggregationFunction) a DeltaTableSource |
CronSchedule |
Rögzített cron ütemezés szerint |
ColumnSelection (forrás DeltaTableSource) |
TableTrigger |
Minden forrástábla véglegesítése |
Szolgáltatások innen: StreamSource |
StreamingMode |
Folyamatos streamelés |
Nem lehet olyan funkciókat létrehozni, amelyek különböző eseményindító-típusokat igényelnek egyetlen materialize_features hívásban. Ehelyett külön hívásokat kell kibocsátanak.
Bétaverziós funkciók migrálása nyilvános előzetes verzióra
A Funkciónézetek nyilvános előzetes verziója első osztályú funkcióentititásokat vezet be a Unity Katalógusban, amelyeket a CREATE FEATURE jogosultságok szabályoznakREAD FEATURE, és a 0.16.0-s vagy újabb verziót igényli.databricks-feature-engineering A bétaverzió során létrehozott funkciók (a 0.15.0-s verzióval) Unity Catalog-függvényekként vannak tárolva, és nem támogatják az összes nyilvános előzetes verziójú funkciót. A hosszú távú nyilvános előzetes verzió támogatásához hozza létre újra a bétaverziós funkciókat a 0.16.0-s verzióval. A szolgáltatásokat nem csak újra kell törölni és újra létrehozni.
A funkciókról további információt a Funkciónézetek című témakörben talál.
Mit kell tenned
- Frissítsen a 0.16.0-ra. Ez a nyilvános előzetes verziójú funkciókhoz (köteg és streamelés) szükséges ügyfélverzió.
- Hozza létre újra a funkciókat. A bétaverziós funkciónézeteket törölni kell és újra létre kell hozni, nem kell újra materializálni, mert nem támogatják az összes nyilvános előzetes verziójú funkciót.
- Migrálás az ablak bezárása előtt. A meglévő bétaszolgáltatásokat 2026. július 22-e előtt kell áttelepíteni.
Bétaverziós és nyilvános előzetes verziójú funkciók azonosítása
A nyilvános előzetes verziójú funkciók funkcióobjektumként jelennek meg a Unity Catalogban, például a Katalóguskezelőben. A bétaszolgáltatások YAML-definícióval rendelkező függvényként jelennek meg. A függvényként ábrázolt összes funkció egy bétaverziós funkció, amelyet át kell telepítenie.
Bétaverziós funkciók migrálása
A bétaverziós funkció migrálása három részből áll:
- Hozza létre újra a funkciót nyilvános előzetes verziójú funkcióként.
- A funkció újravalósítása, így offline és online táblái újraépülnek az új funkció alatt.
- A migrált funkciók ellenőrzése után törölje a bétaszolgáltatásokat és azok materializációit.
A funkciók ismételt létrehozása
A list_beta_feature_views bétaverziós funkciók megkeresésére, Feature.clone() a nem regisztrált példányok létrehozására és register_feature az egyes példányok újbóli regisztrálására használható nyilvános előzetes verziójú funkcióként. A klónozás törli a regisztrációt, a katalógust és a sémát, hogy a funkció újra regisztrálható legyen.
A névütközések elkerülése érdekében regisztrálja a migrált szolgáltatásokat más néven vagy a bétaverziós funkcióktól eltérő sémában. Az alábbi példa újra regisztrálja az eredeti sémában lévő összes funkciót egy _migrated név utótaggal.
# Update this to the catalog whose beta Feature Views you want to migrate.
CATALOG_TO_MIGRATE = "main"
from databricks.feature_engineering import FeatureEngineeringClient
fe = FeatureEngineeringClient()
# 1. Find every beta Feature View in the catalog. Returns Feature objects,
# scanned across all schemas in the catalog.
beta_features = fe.list_beta_feature_views(catalog_name=CATALOG_TO_MIGRATE)
# Keep each beta feature paired with its migrated counterpart for the next steps.
migrations = []
for beta_feature in beta_features:
catalog_name, schema_name, leaf_name = beta_feature.full_name.split(".")
# 2. Clone the feature as an unregistered copy, renamed with a "_migrated" suffix.
cloned = beta_feature.clone(new_name=f"{leaf_name}_migrated")
# 3. Re-register the clone as a Public Preview feature.
migrated = fe.register_feature(
feature=cloned,
catalog_name=catalog_name,
schema_name=schema_name,
)
migrations.append((beta_feature, migrated))
A migrált funkciók újravalósítása
Ha egy bétaverziós funkció megvalósult, a nyilvános előzetes verzió megfelelőjét újra kell létrehoznia, hogy offline és online táblái újraépülhessenek az új funkció alatt. Adja meg a migrált funkció offline és online áruházbeli konfigurációit, és rekonstruálja az eseményindítót a bétaverzió meglévő materializációjából.
from databricks.feature_engineering.entities import (
CronSchedule,
OfflineStoreConfig,
OnlineStoreConfig,
TableTrigger,
)
for beta_feature, migrated in migrations:
# Inspect the beta feature's existing materializations to see what to rebuild and
# to reconstruct the same trigger.
trigger = None
needs_offline = needs_online = False
for mf in fe.list_materialized_features(feature_name=beta_feature.full_name):
needs_online = needs_online or bool(mf.is_online)
needs_offline = needs_offline or not mf.is_online
# Rebuild the trigger from the materialized feature.
if mf.cron_schedule_trigger is not None:
trigger = CronSchedule(
quartz_cron_expression=mf.cron_schedule_trigger.cron_expression,
timezone_id="UTC", # Materialized schedules run in UTC.
)
elif mf.table_trigger is not None:
trigger = TableTrigger()
elif mf.streaming_mode is not None:
# Streaming features use StreamingMode, which can be reused as-is.
trigger = mf.streaming_mode
if not (needs_offline or needs_online):
continue # The beta feature was never materialized.
catalog_name, schema_name, _ = migrated.full_name.split(".")
fe.materialize_features(
features=[migrated],
offline_config=OfflineStoreConfig(
catalog_name=catalog_name,
schema_name=schema_name,
table_name_prefix="migrated_features",
)
if needs_offline
else None,
online_config=OnlineStoreConfig(
catalog_name=catalog_name,
schema_name=schema_name,
table_name_prefix="migrated_features",
online_store_name="my_online_store",
)
if needs_online
else None,
trigger=trigger,
)
Megjegyzés:
Az egyes funkciók saját materialize_features hívásban való megvalósítása külön folyamatot hoz létre. A számítási költségek csökkentése érdekében csoportosítsa azokat a funkciókat, amelyek offline és online célhelyet osztanak meg, és egyetlen materialize_features hívásba aktiválják őket, ha együtt adják át őket a következőben features: .
A bétaverzió funkcióinak törlése
Warning
Csak akkor törölje a bétaszolgáltatásokat és azok materializációit, ha ellenőrizte, hogy a migrált funkciók és a materializált adatok helyesek-e. A törlés visszavonhatatlan.
A migrált funkciók ellenőrzése után törölje az egyes bétafunkciók materializációit, majd magát a béta funkciót.
for beta_feature, _ in migrations:
# Delete the beta feature's materializations first.
mfs = list(fe.list_materialized_features(feature_name=beta_feature.full_name))
offline_mfs = [mf for mf in mfs if not mf.is_online]
if offline_mfs:
# Aggregation features pair an offline and online table; deleting the offline
# materialized feature removes its paired online table too.
for mf in offline_mfs:
fe.delete_materialized_feature(materialized_feature=mf)
else:
# Online-only features (ColumnSelection, streaming) have no offline pair; delete
# the online materialized feature directly.
for mf in mfs:
fe.delete_materialized_feature(materialized_feature=mf)
# Then delete the beta feature definition.
fe.delete_feature(full_name=beta_feature.full_name)