すべてのプロダクト
Search
ドキュメントセンター

Platform For AI:FeatureStore Java SDK

最終更新日:Mar 06, 2026

このトピックでは、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
          }
        ]