| 
					
				 | 
			
			
				@@ -0,0 +1,188 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+package com.tzld.piaoquan.recommend.server.dataloader; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.fasterxml.jackson.databind.ser.Serializers; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.google.common.collect.ListMultimap; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.tzld.piaoquan.recommend.server.common.base.*; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.tzld.piaoquan.recommend.server.common.enums.VlogFeatureGroup; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.tzld.piaoquan.recommend.server.gen.recommend.BaseFeature; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.tzld.piaoquan.recommend.server.gen.recommend.FeatureGroup; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.tzld.piaoquan.recommend.server.gen.recommend.GroupedFeature; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.tzld.piaoquan.recommend.server.service.score.feature.VlogShareLRFeatureExtractor; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.aliyun.odps.Instance; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.aliyun.odps.Odps; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.aliyun.odps.OdpsException; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.aliyun.odps.account.Account; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.aliyun.odps.account.AliyunAccount; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.aliyun.odps.data.Record; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.aliyun.odps.task.SQLTask; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.util.*; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+public class FeatureConstructor { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private static final String BUCKET_NAME = "ali-recommend"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private static  final Map<String, String> ODPS_CONFIG =  new HashMap<String, String>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    static { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ODPS_CONFIG.put("ENDPOINT", "http://service.cn.maxcompute.aliyun.com/api"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ODPS_CONFIG.put("ACCESSID", "LTAIWYUujJAm7CbH"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ODPS_CONFIG.put("ACCESSKEY", "RfSjdiWwED1sGFlsjXv0DlfTnZTG1P"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public static List<Record> loadStreamDataFromOSS(String table, String dt) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Account account = new AliyunAccount(ODPS_CONFIG.get("ACCESSID"), ODPS_CONFIG.get("ACCESSKEY")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Odps odps = new Odps(account); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        odps.setEndpoint(ODPS_CONFIG.get("ENDPOINT")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        odps.setDefaultProject("loghubods"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        String sql = String.format("select * from %s where dt ='%s' limit 100;", table, dt); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        Instance instance; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        List<Record> records = new ArrayList<Record>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            instance = SQLTask.run(odps, sql); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            instance.waitForSuccess(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            records = SQLTask.getResult(instance); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } catch (OdpsException e) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            e.printStackTrace(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return records; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public static RequestContext constructRequestContext(Record record) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        RequestContext requestContext = new RequestContext(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        requestContext.setApptype(record.get("apptype").toString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        requestContext.setMachineinfo_brand(record.get("machineinfo_brand").toString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        requestContext.setMachineinfo_model(record.get("machineinfo_model").toString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        requestContext.setMachineinfo_platform(record.get("machineinfo_platform").toString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        requestContext.setMachineinfo_sdkversion(record.get("machineinfo_sdkversion").toString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        requestContext.setMachineinfo_system(record.get("machineinfo_system").toString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        requestContext.setMachineinfo_wechatversion(record.get("machineinfo_wechatversion").toString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        requestContext.setDay(record.get("ctx_day").toString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        requestContext.setWeek(record.get("ctx_week").toString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        requestContext.setHour(record.get("ctx_hour").toString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        requestContext.setRegion(record.get("ctx_region").toString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        requestContext.setCity(record.get("ctx_city").toString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return requestContext; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public static UserFeature constructUserFeature(Record record) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        UserFeature userFeature = new UserFeature(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        userFeature.setUid(record.getString("uid")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        userFeature.setUser_cycle_bucket_7days(record.getString("u_cycle_bucket_7days")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        userFeature.setUser_cycle_bucket_30days(record.getString("u_cycle_bucket_30days")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        userFeature.setUser_share_bucket_30days(record.getString("u_share_bucket_30days")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 1day features 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        UserActionFeature user1dayActionFeature = new UserActionFeature(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user1dayActionFeature.setExp_cnt(record.getString("u_1day_exp_cnt")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user1dayActionFeature.setClick_cnt(record.getString("u_1day_click_cnt")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user1dayActionFeature.setShare_cnt(record.getString("u_1day_share_cnt")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user1dayActionFeature.setReturn_cnt(record.getString("u_1day_return_cnt")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user1dayActionFeature.setCtr(record.getString("u_ctr_1day")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user1dayActionFeature.setStr(record.getString("u_str_1day")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user1dayActionFeature.setRov(record.getString("u_rov_1day")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user1dayActionFeature.setRos(record.getString("u_ros_1day")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        userFeature.setDay1_cnt_features(user1dayActionFeature); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 3day features 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        UserActionFeature user3dayActionFeature = new UserActionFeature(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user3dayActionFeature.setExp_cnt(record.getString("u_3day_exp_cnt")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user3dayActionFeature.setClick_cnt(record.getString("u_3day_click_cnt")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user3dayActionFeature.setShare_cnt(record.getString("u_3day_share_cnt")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user3dayActionFeature.setReturn_cnt(record.getString("u_3day_return_cnt")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user3dayActionFeature.setCtr(record.getString("u_ctr_3day")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user3dayActionFeature.setStr(record.getString("u_str_3day")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user3dayActionFeature.setRov(record.getString("u_rov_3day")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user3dayActionFeature.setRos(record.getString("u_ros_3day")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        userFeature.setDay3_cnt_features(user3dayActionFeature); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 7day features 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        UserActionFeature user7dayActionFeature = new UserActionFeature(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user7dayActionFeature.setExp_cnt(record.getString("u_7day_exp_cnt")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user7dayActionFeature.setClick_cnt(record.getString("u_7day_click_cnt")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user7dayActionFeature.setShare_cnt(record.getString("u_7day_share_cnt")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user7dayActionFeature.setReturn_cnt(record.getString("u_7day_return_cnt")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user7dayActionFeature.setCtr(record.getString("u_ctr_7day")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user7dayActionFeature.setStr(record.getString("u_str_7day")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user7dayActionFeature.setRov(record.getString("u_rov_7day")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user7dayActionFeature.setRos(record.getString("u_ros_7day")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        userFeature.setDay7_cnt_features(user7dayActionFeature); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // 3month features 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        UserActionFeature user3monthActionFeature = new UserActionFeature(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user3monthActionFeature.setExp_cnt(record.getString("u_3month_exp_cnt")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user3monthActionFeature.setClick_cnt(record.getString("u_3month_click_cnt")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user3monthActionFeature.setShare_cnt(record.getString("u_3month_share_cnt")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user3monthActionFeature.setReturn_cnt(record.getString("u_3month_return_cnt")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user3monthActionFeature.setCtr(record.getString("u_ctr_3month")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user3monthActionFeature.setStr(record.getString("u_str_3month")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user3monthActionFeature.setRov(record.getString("u_rov_3month")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user3monthActionFeature.setRos(record.getString("u_ros_3month")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        userFeature.setMonth3_cnt_features(user3monthActionFeature); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return userFeature; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public static ItemFeature constructItemFeature(Record record){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ItemFeature itemFeature = new ItemFeature(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        itemFeature.setVideoId(record.get("videoid").toString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        itemFeature.setUpId(record.get("i_up_id").toString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        itemFeature.setTitleLength(record.get("i_title_len").toString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        itemFeature.setPlayLength(record.get("i_play_len").toString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        itemFeature.setTotalTime(record.get("total_time").toString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        itemFeature.setDaysSinceUpload(record.get("i_days_since_upload").toString()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        UserActionFeature user1dayActionFeature = new UserActionFeature(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user1dayActionFeature.setExp_cnt(record.getString("i_1day_exp_cnt")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user1dayActionFeature.setClick_cnt(record.getString("i_1day_click_cnt")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user1dayActionFeature.setShare_cnt(record.getString("i_1day_share_cnt")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user1dayActionFeature.setReturn_cnt(record.getString("i_1day_return_cnt")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user1dayActionFeature.setCtr(record.getString("i_ctr_1day")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user1dayActionFeature.setStr(record.getString("i_str_1day")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user1dayActionFeature.setRov(record.getString("i_rov_1day")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user1dayActionFeature.setRos(record.getString("i_ros_1day")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        itemFeature.setDay1_cnt_features(user1dayActionFeature); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        UserActionFeature user3dayActionFeature = new UserActionFeature(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user3dayActionFeature.setExp_cnt(record.getString("i_3day_exp_cnt")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user3dayActionFeature.setClick_cnt(record.getString("i_3day_click_cnt")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user3dayActionFeature.setShare_cnt(record.getString("i_3day_share_cnt")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user3dayActionFeature.setReturn_cnt(record.getString("i_3day_return_cnt")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user3dayActionFeature.setCtr(record.getString("i_ctr_3day")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user3dayActionFeature.setStr(record.getString("i_str_3day")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user3dayActionFeature.setRov(record.getString("i_rov_3day")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user3dayActionFeature.setRos(record.getString("i_ros_3day")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        itemFeature.setDay3_cnt_features(user1dayActionFeature); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        UserActionFeature user7dayActionFeature = new UserActionFeature(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user7dayActionFeature.setExp_cnt(record.getString("i_7day_exp_cnt")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user7dayActionFeature.setClick_cnt(record.getString("i_7day_click_cnt")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user7dayActionFeature.setShare_cnt(record.getString("i_7day_share_cnt")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user7dayActionFeature.setReturn_cnt(record.getString("i_7day_return_cnt")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user7dayActionFeature.setCtr(record.getString("i_ctr_7day")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user7dayActionFeature.setStr(record.getString("i_str_7day")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user7dayActionFeature.setRov(record.getString("i_rov_7day")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user7dayActionFeature.setRos(record.getString("i_ros_7day")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        itemFeature.setDay7_cnt_features(user1dayActionFeature); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        UserActionFeature user3monthActionFeature = new UserActionFeature(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user3monthActionFeature.setExp_cnt(record.getString("i_3month_exp_cnt")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user3monthActionFeature.setClick_cnt(record.getString("i_3month_click_cnt")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user3monthActionFeature.setShare_cnt(record.getString("i_3month_share_cnt")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user3monthActionFeature.setReturn_cnt(record.getString("i_3month_return_cnt")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user3monthActionFeature.setCtr(record.getString("i_ctr_3month")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user3monthActionFeature.setStr(record.getString("i_str_3month")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user3monthActionFeature.setRov(record.getString("i_rov_3month")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user3monthActionFeature.setRos(record.getString("i_ros_3month")); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        itemFeature.setMonth3_cnt_features(user3monthActionFeature); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return itemFeature; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 |