|
@@ -0,0 +1,89 @@
|
|
|
+package examples.dataloader;
|
|
|
+
|
|
|
+import com.tzld.piaoquan.recommend.feature.domain.video.base.RequestContext;
|
|
|
+import com.aliyun.odps.data.Record;
|
|
|
+
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.Map;
|
|
|
+
|
|
|
+public class RequestContextOffline extends RequestContext {
|
|
|
+ public Map<String, Object> featureMap = new HashMap<>();
|
|
|
+
|
|
|
+ public void putUserFeature(Record record){
|
|
|
+ setKVinMap(record, "machineinfo_brand", "string", "");
|
|
|
+ setKVinMap(record, "machineinfo_model", "string", "");
|
|
|
+ setKVinMap(record, "machineinfo_platform", "string","");
|
|
|
+ setKVinMap(record, "machineinfo_system", "string","");
|
|
|
+
|
|
|
+ setKVinMap(record, "u_1day_exp_cnt", "double", "cnt");
|
|
|
+ setKVinMap(record, "u_1day_click_cnt", "double", "cnt");
|
|
|
+ setKVinMap(record, "u_1day_share_cnt", "double", "cnt");
|
|
|
+ setKVinMap(record, "u_1day_return_cnt", "double", "cnt");
|
|
|
+
|
|
|
+ setKVinMap(record, "u_ctr_1day", "double", "rate");
|
|
|
+ setKVinMap(record, "u_str_1day", "double", "rate");
|
|
|
+ setKVinMap(record, "u_rov_1day", "double", "rate");
|
|
|
+ setKVinMap(record, "u_ros_1day", "double", "rate");
|
|
|
+ }
|
|
|
+ public void putItemFeature(Record record){
|
|
|
+ setKVinMap(record, "i_title_len", "double", "cnt");
|
|
|
+ setKVinMap(record, "total_time", "double", "cnt");
|
|
|
+ setKVinMap(record, "i_days_since_upload", "double", "cnt");
|
|
|
+ setKVinMap(record, "play_count_total", "double", "cnt");
|
|
|
+
|
|
|
+ setKVinMap(record, "i_1day_exp_cnt", "double", "cnt");
|
|
|
+ setKVinMap(record, "i_1day_click_cnt", "double", "cnt");
|
|
|
+ setKVinMap(record, "i_1day_share_cnt", "double", "cnt");
|
|
|
+ setKVinMap(record, "i_1day_return_cnt", "double", "cnt");
|
|
|
+
|
|
|
+ setKVinMap(record, "i_ctr_1day", "double", "rate");
|
|
|
+ setKVinMap(record, "i_str_1day", "double", "rate");
|
|
|
+ setKVinMap(record, "i_rov_1day", "double", "rate");
|
|
|
+ setKVinMap(record, "i_ros_1day", "double", "rate");
|
|
|
+ }
|
|
|
+
|
|
|
+ public void putSceneFeature(Record record){
|
|
|
+ setKVinMap(record, "ctx_week", "string", "");
|
|
|
+ setKVinMap(record, "ctx_hour", "string", "");
|
|
|
+ setKVinMap(record, "ctx_region", "string","");
|
|
|
+ setKVinMap(record, "ctx_city", "string","");
|
|
|
+ }
|
|
|
+ private void setKVinMap(Record record, String key, String instance, String cntOrRate){
|
|
|
+ if (record.getString(key) == null){
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ String ins = instance.toLowerCase();
|
|
|
+ switch (ins){
|
|
|
+ case "string":
|
|
|
+ featureMap.put(key, record.getString(key));
|
|
|
+ return;
|
|
|
+ case "double":
|
|
|
+ if ("cnt".equals(cntOrRate)){
|
|
|
+ featureMap.put(key, this.bucketRatioFeature(Double.valueOf(record.getString(key))));
|
|
|
+ }else if ("rate".equals(cntOrRate)){
|
|
|
+ featureMap.put(key, this.ceilLog(Double.valueOf(record.getString(key))));
|
|
|
+ }
|
|
|
+ return;
|
|
|
+ case "int":
|
|
|
+ return;
|
|
|
+ case "long":
|
|
|
+ return;
|
|
|
+ default:
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ private double ceilLog(Double key) {
|
|
|
+ return Math.ceil(Math.log(key + 1.0));
|
|
|
+ }
|
|
|
+
|
|
|
+ private double bucketRatioFeature(Double key) {
|
|
|
+ long bucket = Math.round(Math.log((key + 1.0) * 50.0));
|
|
|
+ if (bucket > 50L) {
|
|
|
+ bucket = 50L;
|
|
|
+ }
|
|
|
+
|
|
|
+ return (double)bucket;
|
|
|
+ }
|
|
|
+}
|