Tous les produits
Search
Centre de documentation

Platform For AI:SDK FeatureStore pour Java

Dernière mise à jour :Aug 09, 2026

Utilisez le SDK Java FeatureStore pour lire les données de caractéristiques en ligne depuis votre projet PAI FeatureStore au moment de l'inférence. Le SDK prend en charge trois types de caractéristiques :

Type de caractéristique Méthode de récupération Cas d'utilisation typique
Caractéristique hors ligne Vue de caractéristique (FeatureView) Attributs utilisateur ou élément synchronisés par lots
Caractéristique en temps réel Vue de caractéristique (FeatureView) Signaux mis à jour en direct écrits directement dans le magasin en ligne
Caractéristique séquentielle Vue de caractéristique séquentielle (SequenceFeatureView) Historique d'événements ordonnés (clics, lectures, achats)

Pour récupérer des caractéristiques groupées par modèle, utilisez Model.getOnlineFeatures() ou Model.getOnlineFeaturesWithEntity() au lieu d'interroger chaque vue de caractéristique individuellement.

Prérequis

Avant de commencer, assurez-vous de disposer des éléments suivants :

  • Un projet FeatureStore avec au moins une entité de caractéristique, une vue de caractéristique et une caractéristique de modèle configurées et synchronisées. Consultez la rubrique Configurer un projet FeatureStore.

  • Un ID AccessKey et un secret AccessKey pour votre compte Alibaba Cloud. Consultez la rubrique Créer une AccessKey.

  • L'ID AccessKey et le secret AccessKey stockés en tant que variables d'environnement locales. Consultez la rubrique Configurer des variables d'environnement.

Remarque

Le SDK se connecte directement au magasin en ligne. Le client doit s'exécuter au sein d'un Virtual Private Cloud (VPC). Par exemple, un magasin en ligne basé sur Hologres n'est accessible qu'à partir du VPC associé à cette instance Hologres.

Étape 1 : Installer le SDK

Téléchargez et installez le SDK Java FeatureStore.

Étape 2 : Initialiser le client

Créez un objet Configuration avec vos identifiants et le nom de votre projet, puis transmettez-le à FeatureStoreClient. Tous les appels ultérieurs de récupération de caractéristiques passent par ce client.

API

Configuration configuration = new Configuration(regionId, accessKeyId, accessKeySecret, projectName);

Paramètres

Paramètre Exemple Description
regionId cn-hangzhou Région de déploiement de votre projet FeatureStore
accessKeyId System.getenv("ACCESS_KEY_ID") ID AccessKey lu à partir d'une variable d'environnement
accessKeySecret System.getenv("ACCESS_KEY_SECRET") Secret AccessKey lu à partir d'une variable d'environnement
projectName holo_pro Nom de votre projet FeatureStore

Exemple

public class Constants {
    public static String accessId = "";
    public static String accessKey = "";
    public static String host = "paifeaturestore.cn-hangzhou.aliyuncs.com";

    static {
        // Read credentials from environment variables — never hardcode them.
        accessId = System.getenv("ACCESS_KEY_ID");
        accessKey = System.getenv("ACCESS_KEY_SECRET");
    }
}

// Initialize the configuration.
Configuration configuration = new Configuration("cn-hangzhou", Constants.accessId,
                                                Constants.accessKey, "dec8");
configuration.setDomain(Constants.host);

// Build the API client and the FeatureStore client.
ApiClient apiClient = new ApiClient(configuration);
FeatureStoreClient fsclient = new FeatureStoreClient(apiClient);

Étape 3 : Récupérer les données de caractéristiques à partir d'une vue de caractéristique

Utilisez FeatureView.getOnlineFeatures() pour interroger les caractéristiques stockées dans une vue de caractéristique spécifique. Les deux surcharges renvoient un FeatureResult contenant un enregistrement par ID de jointure.

API

// Retrieve all fields. No alias mapping.
public FeatureResult getOnlineFeatures(String[] joinIds);

// Retrieve selected fields, with optional field aliasing.
public FeatureResult getOnlineFeatures(String[] joinIds, String[] features, Map<String, String> aliasFields);

Paramètres

Paramètre Exemple Description
joinIds {"100001167","100001168"} Valeurs de clé primaire à rechercher. Renvoie un enregistrement par clé.
features {"user_id","city"} Champs à inclure dans la réponse. Passez new String[]{"*"} pour renvoyer tous les champs.
aliasFields {"user_id":"uId"} Renomme les champs dans la réponse. La clé correspond au nom du champ d'origine ; la valeur correspond à l'alias.

Exemple 1 : Vue de caractéristique hors ligne

Récupérez les données de caractéristiques synchronisées à partir d'une table hors ligne.

// Get the offline feature view named "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
);

Exemple de réponse :

[
  {
    "user_id": 100001167,
    "gender": "male",
    "age": 28,
    "city": "Shenyang",
    "item_cnt": 0,
    "follow_cnt": 0,
    "follower_cnt": 0,
    "register_time": 1696658585,
    "tags": "2"
  },
  {
    "user_id": 100004088,
    "gender": "female",
    "age": 28,
    "city": "Changchun",
    "item_cnt": 0,
    "follow_cnt": 8,
    "follower_cnt": 0,
    "register_time": 1695618449,
    "tags": "1"
  },
  {
    "user_id": 100006646,
    "gender": "male",
    "age": 28,
    "city": "Changchun",
    "item_cnt": 0,
    "follow_cnt": 1,
    "follower_cnt": 1,
    "register_time": 1698213339,
    "tags": "1"
  }
]

Exemple 2 : Vue de caractéristique en temps réel

Récupérez les données de caractéristiques écrites directement dans une table en ligne.

// Get the real-time feature view named "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
);

Exemple de réponse :

[
  {"USER_MD5": "35d3d5a52a7515c2ca6bb4d8e965149b", "USER_NICKNAME": "Miss Sini"},
  {"USER_MD5": "0ab7e3efacd56983f16503572d2b9915", "USER_NICKNAME": "Love You"},
  {"USER_MD5": "84dfd3f91dd85ea105bc74a4f0d7a067", "USER_NICKNAME": "Elementary Student's Dad"}
]

Exemple 3 : Vue de caractéristique séquentielle

Récupérez des séquences d'événements ordonnées à l'aide de SequenceFeatureView. Appelez project.getSeqFeatureView() au lieu de getFeatureViewMap().

// Get the sequence feature view named "ots_seq2".
SequenceFeatureView ots_seq2 = project.getSeqFeatureView("ots_seq2");
if (ots_seq2 == null) {
    throw new RuntimeException("This featureView does not exist");
}

// Retrieve all sequence fields. No feature or alias selection needed.
FeatureResult features2 = ots_seq2.getOnlineFeatures(new String[]{"157843277", "157843278"});

Exemple de réponse :

[
  {
    "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",
    "click_50_seq_playtime": "null;15.0",
    "click_50_seq_event_time": "null;1704684504747",
    "click_50_seq_ts": "625662604;625662604"
  }
]

Étape 4 : Récupérer les données de caractéristiques à partir d'une caractéristique de modèle

Une caractéristique de modèle regroupe les vues de caractéristiques et les entités de caractéristiques dont un modèle a besoin au moment du service, ce qui vous permet de toutes les récupérer en un seul appel au lieu d'interroger chaque vue de caractéristique individuellement. Utilisez Model.getOnlineFeatures() pour récupérer les caractéristiques de toutes les entités de caractéristiques associées, ou Model.getOnlineFeaturesWithEntity() pour limiter la réponse à une entité de caractéristique spécifique.

API

// Retrieve features from all feature entities in the model feature.
public FeatureResult getOnlineFeatures(Map<String, List<String>> joinIds);

// Retrieve features from a specific feature entity in the model feature.
public FeatureResult getOnlineFeaturesWithEntity(Map<String, List<String>> joinIds, String featureEntityName);

Paramètres

Paramètre Exemple Description
joinIds {"user_id": ["101598051", "101598471"]} Une carte des noms d'ID de jointure vers des listes de valeurs de clé primaire. Chaque clé correspond à une entité de caractéristique.
featureEntityName "user" Le nom de l'entité de caractéristique à laquelle limiter la requête. Utilisé uniquement avec getOnlineFeaturesWithEntity().
Une caractéristique de modèle peut être associée à plusieurs entités de caractéristiques. Fournissez le même nombre d'ID pour chaque type d'ID de jointure. Le SDK associe les ID par position dans toutes les listes.

Exemple 1 : Caractéristique de modèle sans caractéristiques séquentielles

Cet exemple récupère les caractéristiques pour user_id et item_id à partir de la caractéristique de modèle model_ots1, qui joint une entité de caractéristique utilisateur et une entité de caractéristique élément.

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"));

Récupérer les caractéristiques de toutes les entités de caractéristiques :

FeatureResult fr1 = mf1.getOnlineFeatures(mm);

Exemple de réponse :

[
  {
    "user_id": 101598051, "gender": "male", "age": 28, "city": "Hangzhou",
    "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": "Shenzhen",
    "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": "Shenzhen",
    "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"
  }
]

Récupérer les caractéristiques d'une entité de caractéristique spécifique uniquement :

Transmettez le nom de l'entité de caractéristique ("server") pour limiter la réponse aux champs de cette entité.

FeatureResult fr2 = mf1.getOnlineFeaturesWithEntity(mm, "server");

Exemple de réponse :

[
  {"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"}
]

Exemple 2 : Caractéristique de modèle avec caractéristiques séquentielles

Lorsqu'une caractéristique de modèle inclut une vue de caractéristique séquentielle, la réponse combine les champs de caractéristiques réguliers avec les champs séquentiels. Cet exemple utilise mdt1, où join_id correspond à 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"));

Récupérer les caractéristiques de toutes les entités de caractéristiques :

FeatureResult fr3 = mdt2.getOnlineFeatures(fsmap);

Exemple de réponse (les champs séquentiels préfixés par click_50_seq_ apparaissent aux côtés des attributs réguliers) :

[
  {
    "click_50_seq_event_time": "null;1698170945",
    "gender": "male",
    "click_50_seq_ts": "1704292557212;1704292557212",
    "city": "Shenyang",
    "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": "Ningbo",
    "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": "Shenyang",
    "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": "Ningbo",
    "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
  }
]

Récupérer les caractéristiques d'une entité de caractéristique spécifique uniquement :

FeatureResult fr4 = mdt1.getOnlineFeaturesWithEntity(fsmap, "client");

Exemple de réponse (champs côté utilisateur et champs séquentiels uniquement, champs élément exclus) :

[
  {
    "click_50_seq_event_time": "null;1698170945",
    "gender": "male",
    "click_50_seq_ts": "1704292555552;1704292555552",
    "city": "Shenyang",
    "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": "Ningbo",
    "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": "Shenyang",
    "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": "Ningbo",
    "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
  }
]

Étapes suivantes