Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bu makalede, adım adım bir işlemde uç noktaya hizmet veren bir özelliğin nasıl dağıtılacağı ve sorgu yapılacağı gösterilmektedir. Bu makalede Databricks SDK'sı kullanılmaktadır. Bazı adımlar REST API veya Databricks kullanıcı arabirimi kullanılarak da tamamlanabilir ve bu yöntemlerin belgelerine başvurular içerebilir.
Bu örnekte, konumları (enlem ve boylam) olan bir şehir tablonuz ve kullanıcının bu şehirlerle olan geçerli mesafesini dikkate alan bir önerilen uygulamanız vardır. Kullanıcının konumu sürekli değiştiğinden, kullanıcı ile her şehir arasındaki mesafe çıkarılma sırasında hesaplanmalıdır. Bu öğreticide Databricks Online Özellik Deposu ve Databricks Özellik Sunma kullanılarak düşük gecikme süresiyle bu hesaplamaların nasıl gerçekleştirebileceğiniz gösterilmektedir. Örnek kodun tamamı için
1. Adım. Kaynak tabloyu oluşturma
Kaynak tablo önceden derlenmiş özellik değerleri içerir ve Unity Kataloğu'nda birincil anahtara sahip herhangi bir Delta tablosu olabilir. Bu örnekte tablo, enlem ve boylamlarıyla şehirlerin listesini içerir. Birincil anahtardır destination_id. Örnek veriler aşağıda gösterilmiştir.
| Adı | destination_id (pk) | enlem | boylam |
|---|---|---|---|
| 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 |
2. Adım. Çevrimiçi özellik deposu oluşturma
Databricks Online Özellik Depoları hakkında ayrıntılı bilgi için bkz. Databricks Online Özellik Mağazaları.
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
)
3. Adım. Unity Kataloğu'nda işlev oluşturma
Bu örnekte işlev, hedef (konumu değişmeyen) ile kullanıcı (konumu sık değişen ve çıkarım zamanına kadar bilinmeyen) arasındaki mesafeyi hesaplar.
# 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
$$""")
4. Adım. Unity Kataloğu'nda özellik belirtimi oluşturma
Özellik belirtimi, uç noktanın hizmet verdikleri özellikleri ve arama anahtarlarını belirtir. Ayrıca, alınan özelliklere kendi bağlamalarıyla uygulamak için gerekli işlevleri de belirtir. Ayrıntılar için bkz. Bir FeatureSpec oluşturun.
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
Adım 5. Uç noktaya hizmet veren özellik oluşturma
Uç noktaya hizmet veren bir özellik oluşturmak için burada gösterilen Uç nokta oluşturma kullanıcı arabirimini, REST API'yi veya Databricks SDK'sını kullanabilirsiniz.
Özellik sunma uç noktası, 4. Adımda oluşturduğunuz öğesini parametre olarak alır feature_spec .
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)
6. Adım. Özellik sunma uç noktasını sorgulama
Uç noktayı sorguladığınızda birincil anahtarı ve isteğe bağlı olarak işlevin kullandığı bağlam verilerini sağlarsınız. Bu örnekte işlev kullanıcının geçerli konumunu (enlem ve boylam) girdi olarak alır. Kullanıcının konumu sürekli değiştiğinden, işleve bağlam özelliği olarak çıkarım zamanında sağlanmalıdır.
Ayrıca kullanıcı arabirimini kullanarak uç noktayı sorgulayabilirsiniz Kullanıcı arabirimini veya REST API'yi kullanarak bir uç noktayı sorgulama.
Kolaylık olması için, bu örnek yalnızca iki şehre olan uzaklığı hesaplar. Daha gerçekçi bir senaryo, hangi şehirlerin önerileceğini belirlemek için kullanıcının özellik tablosundaki her konumdan uzaklığı hesaplayabilir.
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)
Örnek not defteri
Adımların tam bir çizimi için bu not defterine bakın:
Özellik Çevrimiçi mağaza ile örnek not defteri sunma
not defteri alma
Ek bilgi
Özellik mühendisliği Python API'sini kullanma hakkında ayrıntılı bilgi için başvuru belgelerine bakın.