メインコンテンツまでスキップ

Work with 特徴量テーブル in ワークスペース Feature Store (legacy)

注記

このドキュメントでは、ワークスペース Feature Store について説明します。 Databricks での特徴量エンジニアリングUnity Catalogの使用を推奨しています。ワークスペース Feature Store は今後廃止される予定です。

Unity Catalogでの特徴量テーブルの操作に関する情報については、Unity Catalogでの特徴量テーブルの操作を参照してください。

このページでは、ワークスペース Feature Storeで特徴量テーブルを作成して操作する方法について説明します。

注記

ワークスペースで Unity Catalogが有効になっている場合、 Unity Catalog によって管理されるプライマリキーを持つテーブルは、自動的にモデル トレーニングと推論に使用できる特徴量テーブルになります。 セキュリティ、リネージ、タグ付け、ワークスペース間のアクセスなど、すべての Unity Catalog 機能は、特徴量テーブルで自動的に使用可能になります。 Unity Catalog対応ワークスペースでの特徴量テーブルの操作に関する情報については、「Unity Catalogでの特徴量テーブルの操作」を参照してください。

特徴量のリネージと鮮度の追跡に関する情報については、 ワークスペース Feature Store (legacy) の「機能の検出」と「特徴量のリネージの追跡」を参照してください。

注記

データベース名と特徴量テーブル名に使用できるのは、英数字とアンダースコア (_) のみです。

特徴量テーブルのデータベースを作成する

特徴量テーブルを作成する前に、特徴量テーブルを格納する データベース を作成する必要があります。

%sql CREATE DATABASE IF NOT EXISTS <database-name>

特徴量テーブルは Delta テーブルとして格納されます。 create_table (Feature Store クライアント v0.3.6 以降) または create_feature_table (v0.3.5 以前) で特徴量テーブルを作成する場合は、データベース名を指定する必要があります。たとえば、この引数は、データベース recommender_systemcustomer_features という名前の Delta テーブルを作成します。

name='recommender_system.customer_features'

特徴量テーブルを オンラインストアに公開する場合、デフォルト テーブルとデータベース名は、テーブルの作成時に指定した名前になります。 publish_table メソッドを使用して別の名前を指定できます。

Databricks Feature Store の UI には、オンラインストアのテーブルとデータベースの名前が、その他のメタデータとともに表示されます。

Feature Storeで特徴量テーブルを作成するDatabricks

注記

また、既存の Delta テーブル を特徴量テーブルとして登録することもできます。 「既存のDeltaテーブルを特徴量テーブルとして登録する」を参照してください。

特徴量テーブルを作成するための基本的な手順は次のとおりです。

  1. Python関数を特徴量をコンピュートに書き込みます。各関数の出力は、一意の主キーを持つ Apache Spark DataFrame である必要があります。 プライマリ・キーは、1 つ以上のカラムで構成できます。
  2. FeatureStoreClient をインスタンス化し、 create_table (v0.3.6 以降) または create_feature_table (v0.3.5 以下) を使用して特徴量テーブルを作成します。
  3. write_tableを使用して特徴量テーブルを設定します。

次の例で使用されているコマンドとパラメーターの詳細については、 Feature Store Python API リファレンスを参照してください。

Python
from databricks.feature_store import feature_table

def compute_customer_features(data):
''' Feature computation code returns a DataFrame with 'customer_id' as primary key'''
pass

# create feature table keyed by customer_id
# take schema from DataFrame output by compute_customer_features
from databricks.feature_store import FeatureStoreClient

customer_features_df = compute_customer_features(df)

fs = FeatureStoreClient()

customer_feature_table = fs.create_table(
name='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 = fs.create_table(
# ...
# df=customer_features_df,
# ...
# )

# To use a composite key, pass all keys in the create_table call

# customer_feature_table = fs.create_table(
# ...
# primary_keys=['customer_id', 'date'],
# ...
# )

# Use write_table to write data to the feature table
# Overwrite mode does a full refresh of the feature table

fs.write_table(
name='recommender_system.customer_features',
df = customer_features_df,
mode = 'overwrite'
)

既存の Delta テーブルを特徴量テーブルとして登録する

v0.3.8以降では、既存の Delta テーブル を特徴量テーブルとして登録することができます。 Delta テーブルはメタストアに存在する必要があります。

注記

登録した特徴量テーブルを更新するには、Feature Store Python APIを使用する必要があります。

Python
fs.register_table(
delta_table='recommender.customer_features',
primary_keys='customer_id',
description='Customer features'
)

特徴量テーブルへのアクセスを制御する

「ワークスペース Feature Store (legacy)」の「特徴量テーブルへのアクセスを制御する」を参照してください。

特徴量テーブルの更新

特徴量テーブルを更新するには、新しい特徴量テーブルを追加するか、主キーに基づいて特定の行を変更します。

次の特徴量テーブルのメタデータは更新できません。

  • プライマリーキー
  • partitionKey
  • 既存のフィーチャの名前またはタイプ

既存の特徴量テーブルに新しい特徴量テーブルを追加

既存の特徴量テーブルに新しい特徴量を追加するには、次の 2 つの方法があります。

  • 既存の特徴量計算関数を更新し、返された DataFrameで write_table を実行します。 これにより、特徴量テーブル スキーマが更新され、主キーに基づいて新しい特徴量テーブル値がマージされます。
  • 新しい特徴量計算関数を作成して、新しい特徴量を計算します。 この新しい計算関数によって返される DataFrame には、特徴量テーブルの主キーとパーティション キー (定義されている場合) が含まれている必要があります。 実行 write_table DataFrame を使用して、同じ主キーを使用して、新しい特徴量テーブルを既存の特徴量テーブルに書き込みます。

特徴量テーブルの特定の行のみを更新する

write_tablemode = "merge"を使用します。write_table呼び出しで送信された DataFrame にプライマリ・キーが存在しないローは変更されません。

Python
fs.write_table(
name='recommender.customer_features',
df = customer_features_df,
mode = 'merge'
)

特徴量テーブルを更新するジョブのスケジュール

特徴量テーブルの特徴量テーブルに常に最新の値が含まれるようにするために、 Databricks では、ノートブックを実行して特徴量テーブルを定期的に (毎日など) 更新するジョブを作成することをお勧めします。 スケジュールされていないジョブがすでに作成されている場合は、スケジュール済みジョブに変換して、機能値が常に最新の状態であることを確認できます。 「Databricks のオーケストレーションの概要」を参照してください。

特徴量テーブルを更新するコードでは、次の例に示すように、 mode='merge'を使用します。

Python
fs = FeatureStoreClient()

customer_features_df = compute_customer_features(data)

fs.write_table(
df=customer_features_df,
name='recommender_system.customer_features',
mode='merge'
)

日次フィーチャの過去の値を保存する

複合主キーを持つ特徴量テーブルを定義します。 主キーに日付を含めます。 たとえば、特徴量テーブル store_purchasesの場合、効率的な読み取りのために複合主キー (dateuser_id) とパーティション キー date を使用できます。

Python
fs.create_table(
name='recommender_system.customer_features',
primary_keys=['date', 'customer_id'],
partition_columns=['date'],
schema=customer_features_df.schema,
description='Customer features'
)

その後、特徴量テーブルから date をフィルター処理して対象期間に読み取るコードを作成できます。

また、timestamp_keys 引数を使用して date 列をタイムスタンプ キーとして指定することで、time series 特徴量テーブルを作成することもできます。

Python
fs.create_table(
name='recommender_system.customer_features',
primary_keys=['date', 'customer_id'],
timestamp_keys=['date'],
schema=customer_features_df.schema,
description='Customer timeseries features'
)

これにより、 create_training_set または score_batchを使用する際のポイントインタイムルックアップが可能になります。 システムは、指定した timestamp_lookup_key を使用して、時点のタイムスタンプ結合を実行します。

特徴量テーブルを最新の状態に保つには、特徴量テーブルを書き込むか、新しい特徴量テーブル値を特徴量テーブルにストリーミングするように定期的にスケジュールされたジョブを設定します。

フィーチャを更新するためのストリーミング フィーチャ計算パイプラインの作成

ストリーミング特徴量の計算パイプラインを作成するには、ストリーミング DataFrame を引数として write_tableに渡します。 このメソッドは、 StreamingQuery オブジェクトを返します。

Python
def compute_additional_customer_features(data):
''' Returns Streaming DataFrame
'''
pass # not shown

customer_transactions = spark.readStream.load("dbfs:/events/customer_transactions")
stream_df = compute_additional_customer_features(customer_transactions)

fs.write_table(
df=stream_df,
name='recommender_system.customer_features',
mode='merge'
)

特徴量テーブルから読み取る

read_table を使用して特徴値を読み取ります。

Python
fs = feature_store.FeatureStoreClient()
customer_features_df = fs.read_table(
name='recommender.customer_features',
)

特徴量テーブルの検索と閲覧

Feature Store UI を使用して、特徴量テーブルを検索または参照します。

  1. サイドバーで、 Machine Learning>Feature Store を選択して、Feature StoreのUIを表示します。

  2. 検索ボックスに、特徴量テーブル、特徴量テーブル、または特徴量の計算に使用されるデータソースの名前の全部または一部を入力します。 タグのキーまたは値の全部または一部を入力することもできます。検索テキストでは、大文字と小文字は区別されません。

    フィーチャ検索の例

Get 特徴量テーブル metadata

特徴量テーブルのメタデータを取得する API は、使用している Databricks ランタイムのバージョンによって異なります。 v0.3.6 以降では、 get_tableを使用します。 v0.3.5 以前では、 get_feature_tableを使用します。

Python
# this example works with v0.3.6 and above
# for v0.3.5, use `get_feature_table`
from databricks.feature_store import FeatureStoreClient
fs = FeatureStoreClient()
fs.get_table("feature_store_example.user_feature_table")

特徴量テーブル tags の操作

タグはキーと値のペアで、 特徴量テーブルを検索して作成して使用できます。 タグの作成、編集、削除は、Feature Store UIまたは Feature Store Python APIを使用して行うことができます。

UI での特徴量テーブル タグの操作

Feature Store UI を使用して、特徴量テーブルを検索または参照します。UI にアクセスするには、サイドバーで [ 機械学習] > Feature Store を選択します。

Feature Store UIを使用してタグを追加する

  1. タグアイコンまだ開いていない場合はクリックしてください。 タグテーブルが表示されます。

    タグテーブル

  2. 「名前 」フィールドと 「値 」フィールドをクリックし、タグのキーと値を入力します。

  3. [ 追加 ] をクリックします。

Feature Store UIを使用したタグの編集または削除

既存のタグを編集または削除するには、[ アクション ] 列のアイコンを使用します。

タグアクション

Feature Store Python APIを使用した特徴量テーブル タグの操作

v0.4.1 以降を実行しているクラスターでは、Feature Store Python APIを使用してタグを作成、編集、削除できます。

必要条件

Feature Store クライアント v0.4.1 以降

Feature Storeを使用してタグ付きの特徴量テーブルを作成します Python API

Python
from databricks.feature_store import FeatureStoreClient
fs = FeatureStoreClient()

customer_feature_table = fs.create_table(
...
tags={"tag_key_1": "tag_value_1", "tag_key_2": "tag_value_2", ...},
...
)

Feature Store Python API を使用したタグの追加、更新、削除

Python
from databricks.feature_store import FeatureStoreClient
fs = FeatureStoreClient()

# Upsert a tag
fs.set_feature_table_tag(table_name="my_table", key="quality", value="gold")

# Delete a tag
fs.delete_feature_table_tag(table_name="my_table", key="quality")

Update データソース for a 特徴量テーブル

Feature Storeは、コンピュートフィーチャーに使用されたデータソースを自動的に追跡します。 また、Feature Store Python APIを使用して、データソースを手動で更新することもできます。

必要条件

Feature Store クライアント v0.5.0 以降

Feature Store Python APIを使用してデータソースを追加する

以下はコマンドの例です。 詳細については、 API ドキュメントを参照してください。

Python
from databricks.feature_store import FeatureStoreClient
fs = FeatureStoreClient()

# Use `source_type="table"` to add a table in the metastore as data source.
fs.add_data_sources(feature_table_name="clicks", data_sources="user_info.clicks", source_type="table")

# Use `source_type="path"` to add a data source in path format.
fs.add_data_sources(feature_table_name="user_metrics", data_sources="dbfs:/FileStore/user_metrics.json", source_type="path")

# Use `source_type="custom"` if the source is not a table or a path.
fs.add_data_sources(feature_table_name="user_metrics", data_sources="user_metrics.txt", source_type="custom")

Feature Store Python API を使用したデータソースの削除

詳細については、 API ドキュメントを参照してください。

注記

次のコマンドは、ソース名に一致するすべてのタイプ ("table"、"path"、"custom") のデータソースを削除します。

Python
from databricks.feature_store import FeatureStoreClient
fs = FeatureStoreClient()
fs.delete_data_sources(feature_table_name="clicks", sources_names="user_info.clicks")

特徴量テーブルの削除

特徴量テーブルは、Feature Store UI または Feature Store の Python APIを使用して削除できます。

注記
  • 特徴量テーブルを削除すると、上流のプロデューサーと下流のコンシューマー (モデル、エンドポイント、スケジュールされたジョブ) で予期しないエラーが発生する可能性があります。 クラウドプロバイダーで公開されたオンラインストアを削除する必要があります。
  • API を使用して特徴量テーブルを削除すると、基になる Delta テーブルも削除されます。 UI から特徴量テーブルを削除する場合は、基になる Delta テーブルを個別に削除する必要があります。

UIを使用した特徴量テーブルの削除

  1. 特徴量テーブル ページで、特徴量テーブル名の右側にある ボタンダウン をクリックし、 削除 を選択します。 特徴量テーブルに対する CAN MANAGE 権限がない場合、このオプションは表示されません。

    ドロップダウンメニューから削除を選択します

  2. 「特徴量テーブルの削除」ダイアログで、「 削除 」をクリックして確定します。

  3. 基になる Delta テーブルも削除する場合は、ノートブックで次のコマンドを実行します。

    SQL
    %sql DROP TABLE IF EXISTS <feature-table-name>;

Feature Store Python APIを使用した特徴量テーブルの削除

Feature Store クライアント v0.4.1 以降では、 drop_table を使用して特徴量テーブルを削除できます。drop_tableを使用してテーブルを削除すると、基になる Delta テーブルも削除されます。

Python
fs.drop_table(
name='recommender_system.customer_features'
)