Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Artikel ini memperlihatkan cara menyebarkan dan mengkueri fitur yang melayani titik akhir dalam proses langkah demi langkah. Artikel ini menggunakan Databricks SDK. Beberapa langkah juga dapat diselesaikan menggunakan REST API atau UI Databricks dan menyertakan referensi ke dokumentasi untuk metode tersebut.
Dalam contoh ini, Anda memiliki tabel kota dengan lokasi mereka (garis lintang dan bujur) dan aplikasi pemberi rekomendasi yang memperhitungkan jarak pengguna saat ini dari kota-kota tersebut. Karena lokasi pengguna berubah terus-menerus, jarak antara pengguna dan setiap kota harus dihitung pada saat inferensi. Tutorial ini menggambarkan cara melakukan perhitungan tersebut dengan latensi rendah menggunakan Databricks Online Feature Store dan Databricks Feature Serving. Untuk kumpulan lengkap kode contoh, lihat contoh buku catatan .
Langkah 1. Membuat tabel sumber
Tabel sumber berisi nilai fitur yang telah dikomputasi sebelumnya dan bisa menjadi tabel Delta apa pun di Katalog Unity dengan kunci utama. Dalam contoh ini, tabel berisi daftar kota dengan garis lintang dan bujurnya. Kunci utamanya adalah destination_id. Data sampel ditunjukkan di bawah ini.
| nama | tujuan_id (pk) | garis lintang | garis bujur |
|---|---|---|---|
| Nashville, Tennessee | 0 | 36.162663 | -86.7816 |
| Honolulu, Hawaii | 1 | 21.309885 | -157.85814 |
| Las Vegas, Nevada | 2 | 36.171562 | -115.1391 |
| New York, New York | 3 | 40.712776 | -74.005974 |
Langkah 2. Membuat penyimpanan fitur online
Untuk detail tentang Penyimpanan Fitur Online Databricks, lihat Penyimpanan Fitur Online Databricks.
from databricks.feature_engineering import FeatureEngineeringClient
fe = FeatureEngineeringClient()
feature_table_name = f"{catalog_name}.{schema_name}.location_features"
function_name = f"{catalog_name}.{schema_name}.distance"
# Create the feature table
fe.create_table(
name = feature_table_name,
primary_keys="destination_id",
df = destination_location_df,
description = "Destination location features."
)
# Enable Change Data Feed to enable CONTINOUS and TRIGGERED publish modes
spark.sql(f"ALTER TABLE {feature_table_name} SET TBLPROPERTIES (delta.enableChangeDataFeed = 'true')")
# Create an online store with specified capacity
online_store_name = f"{username}-online-store"
fe.create_online_store(
name=online_store_name,
capacity="CU_2" # Valid options: "CU_1", "CU_2", "CU_4", "CU_8"
)
# Wait until the state is AVAILABLE
online_store = fe.get_online_store(name=online_store_name)
online_store.state
# Publish the table
published_table = fe.publish_table(
online_store=online_store,
source_table_name=feature_table_name,
online_table_name=online_table_name
)
Langkah 3. Membuat fungsi di Unity Catalog
Dalam contoh ini, fungsi menghitung jarak antara tujuan (yang lokasinya tidak berubah) dan pengguna (yang lokasinya sering berubah dan tidak diketahui sampai waktu inferensi).
# Define the function. This function calculates the distance between two locations.
function_name = f"main.on_demand_demo.distance"
spark.sql(f"""
CREATE OR REPLACE FUNCTION {function_name}(latitude DOUBLE, longitude DOUBLE, user_latitude DOUBLE, user_longitude DOUBLE)
RETURNS DOUBLE
LANGUAGE PYTHON AS
$$
import math
lat1 = math.radians(latitude)
lon1 = math.radians(longitude)
lat2 = math.radians(user_latitude)
lon2 = math.radians(user_longitude)
# Earth's radius in kilometers
radius = 6371
# Haversine formula
dlat = lat2 - lat1
dlon = lon2 - lon1
a = math.sin(dlat/2)**2 + math.cos(lat1) * math.cos(lat2) * math.sin(dlon/2)**2
c = 2 * math.atan2(math.sqrt(a), math.sqrt(1-a))
distance = radius * c
return distance
$$""")
Langkah 4. Membuat spesifikasi fitur di Unity Catalog
Spesifikasi fitur menentukan fitur yang dilayani titik akhir dan kunci pencariannya. Ini juga menentukan fungsi yang diperlukan untuk diterapkan ke fitur yang diambil dengan pengikatannya. Untuk detailnya, lihat Membuat FeatureSpec.
from databricks.feature_engineering import FeatureLookup, FeatureFunction, FeatureEngineeringClient
fe = FeatureEngineeringClient()
features=[
FeatureLookup(
table_name=feature_table_name,
lookup_key="destination_id"
),
FeatureFunction(
udf_name=function_name,
output_name="distance",
input_bindings={
"latitude": "latitude",
"longitude": "longitude",
"user_latitude": "user_latitude",
"user_longitude": "user_longitude"
},
),
]
feature_spec_name = f"main.on_demand_demo.travel_spec"
# The following code ignores errors raised if a feature_spec with the specified name already exists.
try:
fe.create_feature_spec(name=feature_spec_name, features=features, exclude_columns=None)
except Exception as e:
if "already exists" in str(e):
pass
else:
raise e
Langkah 5. Membuat titik akhir penyajian fitur
Untuk membuat titik akhir penyajian fitur, Anda dapat menggunakan UI Membuat titik akhir, REST API, atau Databricks SDK, yang diperlihatkan di sini.
Fitur yang melayani titik akhir mengambil feature_spec yang Anda buat di Langkah 4 sebagai parameter.
from databricks.sdk import WorkspaceClient
from databricks.sdk.service.serving import EndpointCoreConfigInput, ServedEntityInput
# Create endpoint
endpoint_name = "fse-location"
try:
status = workspace.serving_endpoints.create_and_wait(
name=endpoint_name,
config = EndpointCoreConfigInput(
served_entities=[
ServedEntityInput(
entity_name=feature_spec_name,
scale_to_zero_enabled=True,
workload_size="Small"
)
]
)
)
print(status)
# Get the status of the endpoint
status = workspace.serving_endpoints.get(name=endpoint_name)
print(status)
Langkah 6. Mengkueri fitur yang melayani titik akhir
Saat Anda mengkueri titik akhir, Anda menyediakan kunci utama dan secara opsional data konteks apa pun yang digunakan fungsi. Dalam contoh ini, fungsi mengambil sebagai input lokasi pengguna saat ini (garis lintang dan bujur). Karena lokasi pengguna terus berubah, lokasi tersebut harus diberikan kepada fungsi sebagai fitur konteks pada waktu inferensi.
Anda juga dapat mengkueri titik akhir menggunakan Kueri UI titik akhir menggunakan UI atau REST API.
Untuk kesederhanaan, contoh ini hanya menghitung jarak ke dua kota. Skenario yang lebih realistis mungkin menghitung jarak pengguna dari setiap lokasi dalam tabel fitur untuk menentukan kota mana yang akan direkomendasikan.
import mlflow.deployments
client = mlflow.deployments.get_deploy_client("databricks")
response = client.predict(
endpoint=endpoint_name,
inputs={
"dataframe_records": [
{"destination_id": 1, "user_latitude": 37, "user_longitude": -122},
{"destination_id": 2, "user_latitude": 37, "user_longitude": -122},
]
},
)
pprint(response)
Contoh notebook
Lihat buku catatan ini untuk ilustrasi lengkap langkah-langkahnya:
Fitur Menyajikan buku catatan contoh dengan toko online
Ambil buku catatan
Informasi Tambahan
Untuk detail tentang menggunakan rekayasa fitur Python API, lihat dokumentasi referensi.