このトピックでは、Java ソフトウェア開発キット (SDK) を使用して、FeatureStore のオンラインストアからデータを読み取る方法について説明します。このデータには、オフライン特徴、リアルタイム特徴、シーケンス特徴が含まれます。
前提条件
-
FeatureStore でプロジェクト、特徴エンティティ、特徴ビュー、モデル特徴を作成し、データを同期します。詳細については、「FeatureStore プロジェクトの設定」をご参照ください。
-
Alibaba Cloud アカウントの AccessKey ID と AccessKey Secret を取得します。詳細については、「AccessKey の作成」をご参照ください。
AccessKey ID と AccessKey Secret をローカルの環境変数に保存します。詳細については、「環境変数の設定」をご参照ください。
FeatureStore Java SDK のインストール
FeatureStore Java SDK をダウンロードしてインストールします。
FeatureStore クライアントの初期化
API
Configuration クラスを初期化します。
Configuration configuration = new Configuration(regionId,accessKeyId,accessKeySecret,projectName);
パラメーター
|
パラメーター |
例 |
説明 |
|
regionId |
cn-hangzhou |
リージョン |
|
accessKeyId |
System.getenv("ACCESS_KEY_ID") |
環境変数から取得した AccessKey ID。 |
|
accessKeySecret |
System.getenv("ACCESS_KEY_SECRET") |
環境変数から取得した AccessKey Secret。 |
|
projectName |
holo_pro |
FeatureStore プロジェクトの名前。 |
SDK はオンラインストアに直接接続します。クライアントは Virtual Private Cloud (VPC) 環境で実行する必要があります。例えば、Hologres インスタンスには、指定された VPC 内からのみ接続できます。
例
public class Constants {
public static String accessId = "";
public static String accessKey = "";
public static String host = "paifeaturestore.cn-hangzhou.aliyuncs.com";
static {
accessId = System.getenv("ACCESS_KEY_ID");// System.getenv("") は環境変数の値を取得します。
accessKey = System.getenv("ACCESS_KEY_SECRET");
}
}// Configuration クラスを初期化します。
Configuration configuration = new Configuration("cn-hangzhou",Constants.accessId,
Constants.accessKey,"dec8");
configuration.setDomain(Constants.host);
ApiClient apiClient = new ApiClient(configuration);
FeatureStoreClient fsclient = new FeatureStoreClient(apiClient);
特徴ビューからの特徴データの取得
API
public FeatureResult getOnlineFeatures(String[] joinIds);// エイリアスを使用せずにテーブル全体をクエリします。
public FeatureResult getOnlineFeatures(String[] joinIds, String[] features, Map<String, String> aliasFields);
パラメーター
|
パラメーター |
例 |
説明 |
|
joinIds |
{"100001167","100001168"} |
プライマリキー値の配列。クエリはこれらの値に基づいてデータを返します。 |
|
features |
{"user_id","city"} 注:すべてのフィールドを取得するには、new String[]{"*"} を使用します。 |
データテーブルからクエリするフィールド。 |
|
aliasFields |
{"user_id":"uId"} |
データテーブルフィールドのエイリアス。エイリアスは返されるデータに表示されます。 |
例
-
例 1:オフライン特徴ビューから特徴データを取得
-
オフラインテーブルから同期された特徴ビューとデータを取得
// 名前で特徴ビューを取得します。 // mo1 (オフライン特徴ビュー) FeatureView mo1 = project.getFeatureViewMap().get("mo1"); if(mo1==null){ throw new RuntimeException("This featureView does not exist"); } HashMap<String, String> ss = new HashMap<>(); FeatureResult features = mo1.getOnlineFeatures(new String[]{"100001167", "100004088","100006646"}, new String[]{"*"}, ss); -
応答例
[ { "user_id":100001167, "gender":"male", "age":28, "city":"瀋陽", "item_cnt":0, "follow_cnt":0, "follower_cnt":0, "register_time":1696658585, "tags":"2" }, { "user_id":100004088, "gender":"female", "age":28, "city":"長春", "item_cnt":0, "follow_cnt":8, "follower_cnt":0, "register_time":1695618449, "tags":"1" }, { "user_id":100006646, "gender":"male", "age":28, "city":"長春", "item_cnt":0, "follow_cnt":1, "follower_cnt":1, "register_time":1698213339, "tags":"1" } ]
-
-
例 2:リアルタイム特徴ビューから特徴データを取得
-
オンラインテーブルから特徴ビューとデータを取得
// 名前で特徴ビューを取得します。 // tfv1 (オンライン特徴ビュー) FeatureView tfv1 = project.getFeatureViewMap().get("tfv1"); if(tfv1==null){ throw new RuntimeException("This featureView does not exist"); } // データを取得します。 FeatureResult rf = tfv1.getOnlineFeatures(new String[]{"35d3d5a52a7515c2ca6bb4d8e965149b", "0ab7e3efacd56983f16503572d2b9915","84dfd3f91dd85ea105bc74a4f0d7a067"}, new String[]{"*"}, ss); -
応答例
[ { "USER_MD5":"35d3d5a52a7515c2ca6bb4d8e965149b", "USER_NICKNAME":"シニさん" } { "USER_MD5":"0ab7e3efacd56983f16503572d2b9915", "USER_NICKNAME":"愛してる" } { "USER_MD5":"84dfd3f91dd85ea105bc74a4f0d7a067", "USER_NICKNAME":"小学生のパパ" } ]
-
-
例 3:シーケンス特徴ビューから特徴データを取得
-
オフラインテーブルから同期された特徴ビューとデータを取得
// 名前で特徴ビューを取得します。 // ots_seq2 (シーケンス特徴ビュー) SequenceFeatureView ots_seq2 = project.getSeqFeatureView("ots_seq2"); if(ots_seq2==null){ throw new RuntimeException("This featureView does not exist"); } // データを取得します。 FeatureResult features2 = ots_seq2.getOnlineFeatures(new String[]{"157843277", "157843278"}); -
応答例
[ { "click _50_seq_playtime":"null;15.0", "click_50_seq_event_time":"null;1704684504747", "click_50_seq_ts":"625662604;625662604", "user_id":"157843277", "click_50_seq":"null;200167895", "click_50_seq_event":"null;click", "click_50_seq_item_id":"null;200167895" }, { "click_50_seq_playtime":"null;15.0", "click_50_seq_event_time":"null;1704684504747", "click_50_seq_ts":"625662604;625662604", "user_id":"157843278", "click_50_seq":"null;200167895", "click_50_seq_event":"null;click", "click_50_seq_item_id":"null;200167895" } ]
-
モデル特徴からの特徴データの取得
API
public FeatureResult getOnlineFeatures(Map<String, List<String>> joinIds);
public FeatureResult getOnlineFeaturesWithEntity(Map<String, List<String>> joinIds, String featureEntityName);
パラメーター
|
パラメーター |
例 |
説明 |
|
joinIds |
[ "user_id": {"101598051", "101598471", "101601287" } ] |
join ID のマップ。キーは join ID 名、値は join ID の値です。 |
|
featureEntityName |
"user" |
FeatureEntity の片側から指定されたデータを取得します。 |
例
-
例 1:シーケンス特徴ビューを含まないモデル特徴から特徴データを取得
ModelFeature は複数の FeatureEntity に関連付けることができ、複数の join_id を設定して、関連するすべての特徴を一度に返すことができます。
この例には、`join_id`、`user_id`、`item_id` がそれぞれ 2 つ含まれています。特徴を取得する際には、各タイプに同じ数の ID を指定する必要があります。
// モデル特徴を取得します。 Model mf1 = project.getModelFeature("model_ots1"); HashMap<String, List<String>> mm = new HashMap<>(); mm.put("user_id", Arrays.asList("101598051", "101598471", "101601287")); mm.put("item_id",Arrays.asList("200004157", "200006185", "200034730"));-
モデル特徴内のすべての特徴エンティティから特徴データを取得
-
モデル特徴内のすべての特徴エンティティから特徴データを取得
// 関連するすべてのエンティティが含むデータを取得します。 FeatureResult fr1 = mf1.getOnlineFeatures(mm); -
応答例
[ { "user_id":101598051, "gender":"male", "age":28, "city":"杭州", "item_cnt":0, "follow_cnt":0, "follower_cnt":0, "register_time":1695785665, "tags":"1", "item_id":200004157, "author":137649839, "category":2, "click_count":0, "duration":18.0, "praise_count":30, "pub_time":1698208690, "title":"#Workout_Check-in" }, { "user_id":200004157, "gender":"female", "age":31, "city":"深セン", "item_cnt":0, "follow_cnt":1, "follower_cnt":0, "register_time":1695726582, "tags":"1", "item_id":200006185, "author":134195601, "category":14, "click_count":50, "duration":55.0, "praise_count":21, "pub_time":1696700908, "title":"#Idiom_Story" }, { "user_id":101601287, "gender":"female", "age":33, "city":"深セン", "item_cnt":0, "follow_cnt":0, "follower_cnt":55, "register_time":1697519102, "tags":"0", "item_id":200034730, "author":112739045, "category":6, "click_count":2, "duration":9.0, "praise_count":0, "pub_time":1696568654, "title":"#Workout_Check-in" } ]
-
-
モデル特徴内の特定の特徴エンティティから特徴データを取得
-
モデル特徴内の特定の特徴エンティティから特徴データを取得
// サーバー側のエンティティからのみデータを取得します。 FeatureResult fr2 = mf1.getOnlineFeaturesWithEntity(mm, "server"); -
応答例
[ { "item_id":200004157, "author":137649839, "category":2, "click_count":0, "duration":18.0, "praise_count":30, "pub_time":1698208690, "title":"#Workout_Check-in" }, { "item_id":200006185, "author":134195601, "category":14, "click_count":50, "duration":55.0, "praise_count":21, "pub_time":1696700908, "title":"#Idiom_Story" }, { "item_id":200034730, "author":112739045, "category":6, "click_count":2, "duration":9.0, "praise_count":0, "pub_time":1696568654, "title":"#Workout_Check-in" } ]
-
-
-
例 2:シーケンス特徴ビューを含むモデル特徴から特徴データを取得
ModelFeature は複数の FeatureEntity に関連付けることができます。複数の `join_id` を設定して、特徴をまとめて返すことができます。
この例では、`join_id` は `user_id` に対応します。
// シリアル化された特徴を含むモデル特徴からデータを取得します。 Model mdt1 =project.getModelFeature("mdt1"); if(mdt1==null){ throw new RuntimeException("This modelFeature does not exist"); } HashMap<String, List<String>> fsmap = new HashMap<>(); fsmap.put("user_id",Arrays.asList("100001167","100024146")); fsmap.put("item_id",Arrays.asList("200138790","200385417"));-
モデル特徴内の特徴エンティティから特徴データを取得
-
モデル特徴内の特徴エンティティから特徴データを取得
FeatureResult fr3 = mdt2.getOnlineFeatures(fsmap); -
応答例
[ { "click_50_seq_event_time":"null;1698170945", "gender":"male", "click_50_seq_ts":"1704292557212;1704292557212", "city":"瀋陽", "item_id":"200138790", "click_50_seq":"null;204153583", "author":186784264, "pub_time":1696574947, "follower_cnt":0, "follow_cnt":0, "item_cnt":0, "click_count":2, "title":"#Idiom_Story", "register_time":1696658585, "tags":2, "duration":13.0, "click_50_seq_playtime":"null;98.93932923011255", "user_id":"100001167", "praise_count":3, "click_50_seq_event":"null;click", "category":20, "click_50_seq_item_id":"null;204153583", "age":28 }, { "click_50_seq_event_time":"null;1698180365", "gender":"male", "click_50_seq_ts":"1704292547792;1704292547792;1704292547792", "city":"寧波", "item_id":200385417, "click_50_seq":"null;299049390", "author":189247964, "pub_time":1696432224, "follower_cnt":47, "follow_cnt":0, "item_cnt":0, "click_count":4, "title":"#Idiom_Story", "register_time":1697253820, "tags":1, "duration":"9.0", "click_50_seq_playtime":"null;32.15018252408633", "user_id":100024146, "praise_count":0, "click_50_seq_event":"null;click", "category":0, "click_50_seq_item_id":"null;299049390", "age":28 }, { "click_50_seq_event_time":"null;1698170945", "gender":"male", "click_50_seq_ts":"1704292557212;1704292557212", "city":"瀋陽", "item_id":200138790, "click_50_seq":"null;204153583", "author":186784264, "pub_time":1696574947, "follower_cnt":0, "follow_cnt":0, "item_cnt":0, "click_count":2, "title":"#Idiom_Story", "register_time":1696658585, "tags":2, "duration":13.0, "click_50_seq_playtime":"null;98.93932923011255", "user_id":"100001167", "praise_count":3, "click_50_seq_event":"null;click", "category":20, "click_50_seq_item_id":"null;204153583", "age":28 }, { "click_50_seq_event_time":"null;1698180365", "gender":"male", "click_50_seq_ts":"1704292547792;1704292547792", "city":"寧波", "item_id":200385417, "click_50_seq":"null;299049390", "author":189247964, "pub_time":1696432224, "follower_cnt":47, "follow_cnt":0, "item_cnt":0, "click_count":4, "title":"#Idiom_Story", "register_time":1697253820, "tags":1, "duration":9.0, "click_50_seq_playtime":"null;32.15018252408633", "user_id":"100024146", "praise_count":"0", "click_50_seq_event":"null;click", "category":0, "click_50_seq_item_id":"null;299049390", "age":28 } ]
-
-
モデル特徴内の特定の特徴エンティティから特徴データを取得
-
モデル特徴内の特定の特徴エンティティから特徴データを取得
FeatureResult fr4 = mdt1.getOnlineFeaturesWithEntity(fsmap, "client"); -
応答例
[ { "click_50_seq_event_time":"null;1698170945", "gender":"male", "click_50_seq_ts":"1704292555552;1704292555552", "city":"瀋陽", "click_50_seq":"null;204153583", "follower_cnt":0, "follow_cnt":0, "item_cnt":0, "register_time":1696658585, "tags":2, "click_50_seq_playtime":"null;98.93932923011255", "user_id":"100001167", "click_50_seq_event":"null;click", "click_50_seq_item_id":"null;204153583", "age":28 }, { "click_50_seq_event_time":"null;1698180365", "gender":"male", "click_50_seq_ts":"1704292546132;1704292546132;1704292546132", "city":"寧波", "click_50_seq":"null;299049390", "follower_cnt":47, "follow_cnt":0, "item_cnt":0, "register_time":1697253820, "tags":"1", "click_50_seq_playtime":"null;32.15018252408633", "user_id":100024146, "click_50_seq_event":"null;click", "click_50_seq_item_id":"null;299049390", "age":28 }, { "click_50_seq_event_time":"null;1698170945", "gender":"male", "click_50_seq_ts":"1704292555552;1704292555552", "city":"瀋陽", "click_50_seq":"null;204153583", "follower_cnt":0, "follow_cnt":0, "item_cnt":0, "register_time":1696658585, "tags":2, "click_50_seq_playtime":"null;98.93932923011255", "user_id":"100001167", "click_50_seq_event":"null;click", "click_50_seq_item_id":"null;204153583", "age":28 }, { "click_50_seq_event_time":"null;1698180365", "gender":"male", "click_50_seq_ts":"1704292546132;1704292546132;1704292546132", "city":"寧波", "click_50_seq":"null;299049390", "follower_cnt":47, "follow_cnt":0, "item_cnt":0, "register_time":1697253820, "tags":1, "click_50_seq_playtime":"null;32.15018252408633", "user_id":"100024146", "click_50_seq_event":"null;click", "click_50_seq_item_id":"null;299049390", "age":28 } ]
-
-