FeatureStore Go SDK
本文介紹如何使用Go SDK讀取FeatureStore在線數(shù)據(jù)源的數(shù)據(jù)(離線特征、實時特征、序列特征等)。
前提條件
已創(chuàng)建FeatureStore項目(Project)、特征實體(FeatureEntity)、特征視圖(FeatureView)和模型特征(ModelFeature),并完成數(shù)據(jù)同步操作。具體操作,請參見配置FeatureStore項目。
已獲取阿里云賬戶的AccessKey ID和AccessKey Secret。具體操作,請參見創(chuàng)建AccessKey。
建議使用本地配置環(huán)境變量的方式保存AccessKey ID和AccessKey Secret。具體操作,請參見配置環(huán)境變量。
安裝FeatureStore Go SDK
執(zhí)行如下命令安裝FeatureStore Go SDK。
go get github.com/aliyun/aliyun-pai-featurestore-go-sdk/v2
初始化FeatureStore客戶端
接口
//初始化``FeatureStoreClient``實例。
//regionId是實例所在區(qū)域
//accessKeyId是訪問表格存儲服務的AccessKeyID,通過官方網(wǎng)站申請或通過管理員獲取。
//accessKeySecret是訪問表格存儲服務的AccessKeySecret,通過官方網(wǎng)站申請或通過管理員獲取。
//projectName是于控制臺創(chuàng)建的FeatureStore Project名稱
func NewFeatureStoreClient(regionId, accessKeyId, accessKeySecret, projectName string, opts ...ClientOption) (*FeatureStoreClient, error)
由于SDK是直連在線數(shù)據(jù)源,客戶端需要在VPC環(huán)境運行。例如Hologres和GraphCompute需要在指定的VPC才能連接。
示例
accessId := os.Getenv("AccessId")
accessKey := os.Getenv("AccessKey")
client, err := featurestore.NewFeatureStoreClient("cn-beijing", accessId, accessKey, "project_name")
獲取FeatureView的特征數(shù)據(jù)
接口
//根據(jù)joinId的值以及選取的特征名和特征別名獲取FeatureView下具體特征數(shù)據(jù)
GetOnlineFeatures(joinIds []interface{}, features []string, alias map[string]string) ([]map[string]interface{}, error)
參數(shù)說明
參數(shù) | 說明 | |
joinIds | 需要獲取到特征的joinId(主鍵)的值。 | |
features | 指定需要獲取的特征的名稱。 | |
alias | 特征別名配置。需要注意此配置對序列特征FeatureView不生效。 |
示例
// get project by name
project, err := client.GetProject("project_name")
if err != nil {
// t.Fatal(err)
}
// get featureview by name
user_feature_view := project.GetFeatureView("feature_view_name")
if user_feature_view == nil {
// t.Fatal("feature view not exist")
}
// get online features
features, err := user_feature_view.GetOnlineFeatures([]interface{}{"key1", "key2"}, []string{"*"}, nil)
離線/實時FeatureView特征數(shù)據(jù)示例結(jié)果
[ { "city":"合肥市", "follow_cnt":1, "gender":"male", "user_id":"100043186" }, { "city":"", "follow_cnt":5, "gender":"male", "user_id":"100060369" } ]
序列特征FeatureView特征數(shù)據(jù)示例結(jié)果
假設(shè)序列特征讀取配置如下
離線序列特征字段
事件名稱
序列長度
在線序列特征名稱
click_seq_50_seq
click
50
click_seq_50_seq
expr_seq_100_seq
expr
100
expr_seq_100
返回示例結(jié)果
[ { "click_seq_50_seq": "216751275;228787053;220852269;242884721", "click_seq_50_seq__event": "click;click;click;click", "click_seq_50_seq__event_time": "1699128398;1699128398;1699118623;1699118623", "click_seq_50_seq__item_id": "216751275;228787053;220852269;242884721", "click_seq_50_seq__playtime": "65.40;72.06;104.69;62.74", "click_seq_50_seq__ts": "389018;389018;398793;398793", "expr_seq_100": "207474427;216751275;228787053;247136848;270584471;299485479;220852269;242884721;245999124;265863707", "expr_seq_100__event": "expr;expr;expr;expr;expr;expr;expr;expr;expr;expr", "expr_seq_100__event_time": "1699128398;1699128398;1699128398;1699128398;1699128398;1699128398;1699118623;1699118623;1699118623;1699118623", "expr_seq_100__item_id": "207474427;216751275;228787053;247136848;270584471;299485479;220852269;242884721;245999124;265863707", "expr_seq_100__playtime": "0.00;0.00;0.00;0.00;0.00;0.00;0.00;0.00;0.00;0.00", "expr_seq_100__ts": "389018;389018;389018;389018;389018;389018;398793;398793;398793;398793", "user_id": "186569075" }, { "click_seq_50_seq": "201741544;236327912;293320498", "click_seq_50_seq__event": "click;click;click", "click_seq_50_seq__event_time": "1699178245;1699178245;1699178245", "click_seq_50_seq__item_id": "201741544;236327912;293320498", "click_seq_50_seq__playtime": "97.41;70.32;135.21", "click_seq_50_seq__ts": "339171;339171;339171", "expr_seq_100": "201741544;224940066;236327912;240253906;247562151;293320498", "expr_seq_100__event": "expr;expr;expr;expr;expr;expr", "expr_seq_100__event_time": "1699178245;1699178245;1699178245;1699178245;1699178245;1699178245", "expr_seq_100__item_id": "201741544;224940066;236327912;240253906;247562151;293320498", "expr_seq_100__playtime": "0.00;0.00;0.00;0.00;0.00;0.00", "expr_seq_100__ts": "339171;339171;339171;339171;339171;339171", "user_id": "186569870" } ]
獲取ModelFeature里的特征數(shù)據(jù)
接口
//根據(jù)joinId的值以及特征實體(FeatureEntity)獲取ModelFeature里的特征數(shù)據(jù)
GetOnlineFeatures(joinIds map[string][]interface{}) ([]map[string]interface{}, error)
//根據(jù)joinId的值獲取ModelFeature里某個指定的FeatureEntity對應的特征數(shù)據(jù)
GetOnlineFeaturesWithEntity(joinIds map[string][]interface{}, featureEntityName string) ([]map[string]interface{}, error)
參數(shù)說明
參數(shù) | 說明 | |
joinIds | joinIds的map集合。key為JoinId的名稱,values為JoinId的值。 | |
featureEntityName | 指定特定的特征實體名稱。 |
示例
ModelFeature可以關(guān)聯(lián)多個FeatureEntity,可以設(shè)置多個join_id,然后特征統(tǒng)一返回。
示例中有兩個join_id
、user_id
和item_id
。獲取特征的時候需要設(shè)置相同的ID數(shù)量。
// get project by name
project, err := client.GetProject("fs_test_ots")
if err != nil {
// t.Fatal(err)
}
// get ModelFeature by name
model_feature := project.GetModelFeature("rank")
if model_feature == nil {
// t.Fatal("model feature not exist")
}
// get online features
features, err := model_feature.GetOnlineFeatures(map[string][]interface{}{"user_id": {"100000676", "100004208"}, "item_id":{"238038872", "264025480"}} )
也可以指定某個FeatureEntity,將FeatureEntity對應的特征一起返回。
features, err := model_feature.GetOnlineFeaturesWithEntity(map[string][]interface{}{"user_id": {"100000676", "100004208"}}, "user" )
獲取ModelFeature特征數(shù)據(jù)示例(不包含序列特征FeatureView)
[ { "age":26, "city":"沈陽市", "gender":"male", "user_id":"100000676" }, { "age":23, "city":"西安市", "gender":"male", "user_id":"100004208" } ]
獲取ModelFeature特征數(shù)據(jù)示例(包含序列特征FeatureView)
注冊ModelFeature時可以選擇序列特征FeatureView里注冊的離線序列特征字段,之后在FeatureStore Go SDK中便可以獲取到對應的在線序列特征名稱。
序列特征對應FeatureEntity一般為user,示例中有兩個
join_id
、user_id
和item_id
。獲取特征的時候需要設(shè)置相同的ID數(shù)量。假設(shè)序列特征讀取配置如下
離線序列特征字段
事件名稱
序列長度
在線序列特征名稱
click_seq_50_seq
click
50
click_seq_50_seq
返回示例結(jié)果
[ { "age": 51, "author": 147848300, "category": "7", "city": "", "click_count": 0, "click_seq_50_seq": "216751275;228787053;220852269;242884721", "click_seq_50_seq__event": "click;click;click;click", "click_seq_50_seq__event_time": "1699128398;1699128398;1699118623;1699118623", "click_seq_50_seq__item_id": "216751275;228787053;220852269;242884721", "click_seq_50_seq__playtime": "65.40;72.06;104.69;62.74", "click_seq_50_seq__ts": "391447;391447;401222;401222", "duration": 48, "follow_cnt": 2, "follower_cnt": 0, "gender": "female", "item_cnt": 0, "item_id": 299485479, "praise_count": 2, "pub_time": 1697885713, "register_time": 1696582012, "tags": "0", "title": "#健身打卡", "user_id": "186569075" }, { "age": 28, "author": 119734983, "category": "18", "city": "", "click_count": 0, "click_seq_50_seq": "201741544;236327912;293320498", "click_seq_50_seq__event": "click;click;click", "click_seq_50_seq__event_time": "1699178245;1699178245;1699178245", "click_seq_50_seq__item_id": "201741544;236327912;293320498", "click_seq_50_seq__playtime": "97.41;70.32;135.21", "click_seq_50_seq__ts": "341600;341600;341600", "duration": 15, "follow_cnt": 0, "follower_cnt": 2, "gender": "male", "item_cnt": 0, "item_id": 207474427, "praise_count": 79, "pub_time": 1697731285, "register_time": 1699135393, "tags": "1", "title": "#成語故事", "user_id": "186569870" } ]