一、創建Maven項目
創建項目,名稱為LogAnalysis
二、常用工具類
2.1 配置管理組建
ConfigurationManager.java

1 import java.io.InputStream; 2 import java.util.Properties; 3 4 /** 5 * 配置管理組件 6 * 7 * 1、配置管理組件可以復雜,也可以很簡單,對於簡單的配置管理組件來說,只要開發一個類,可以在第一次訪問它的 8 * 時候,就從對應的properties文件中,讀取配置項,並提供外界獲取某個配置key對應的value的方法 9 * 2、如果是特別復雜的配置管理組件,那么可能需要使用一些軟件設計中的設計模式,比如單例模式、解釋器模式 10 * 可能需要管理多個不同的properties,甚至是xml類型的配置文件 11 * 3、我們這里的話,就是開發一個簡單的配置管理組件,就可以了 12 * 13 */ 14 public class ConfigurationManager { 15 16 // Properties對象使用private來修飾,就代表了其是類私有的 17 // 那么外界的代碼,就不能直接通過ConfigurationManager.prop這種方式獲取到Properties對象 18 // 之所以這么做,是為了避免外界的代碼不小心錯誤的更新了Properties中某個key對應的value 19 // 從而導致整個程序的狀態錯誤,乃至崩潰 20 private static Properties prop = new Properties(); 21 22 static { 23 try { 24 InputStream in = ConfigurationManager.class 25 .getClassLoader().getResourceAsStream("conf.properties"); 26 prop.load(in); 27 } catch (Exception e) { 28 e.printStackTrace(); 29 } 30 } 31 32 /** 33 * 獲取指定key對應的value 34 * 35 * @param key 36 * @return value 37 */ 38 public static String getProperty(String key) { 39 40 return prop.getProperty(key); 41 } 42 43 /** 44 * 獲取整數類型的配置項 45 * @param key 46 * @return value 47 */ 48 public static Integer getInteger(String key) { 49 String value = getProperty(key); 50 try { 51 return Integer.valueOf(value); 52 } catch (Exception e) { 53 e.printStackTrace(); 54 } 55 return 0; 56 } 57 58 /** 59 * 獲取布爾類型的配置項 60 * @param key 61 * @return value 62 */ 63 public static Boolean getBoolean(String key) { 64 String value = getProperty(key); 65 try { 66 return Boolean.valueOf(value); 67 } catch (Exception e) { 68 e.printStackTrace(); 69 } 70 return false; 71 } 72 73 /** 74 * 獲取Long類型的配置項 75 * @param key 76 * @return 77 */ 78 public static Long getLong(String key) { 79 String value = getProperty(key); 80 try { 81 return Long.valueOf(value); 82 } catch (Exception e) { 83 e.printStackTrace(); 84 } 85 return 0L; 86 }
2.2 常量的接口
Constants.java

1 /** 2 * 常量接口 3 * @author Administrator 4 * 5 */ 6 public interface Constants { 7 8 /** 9 * 項目配置相關的常量 10 */ 11 String JDBC_DRIVER = "jdbc.driver"; 12 String JDBC_DATASOURCE_SIZE = "jdbc.datasource.size"; 13 String JDBC_URL = "jdbc.url"; 14 String JDBC_USER = "jdbc.user"; 15 String JDBC_PASSWORD = "jdbc.password"; 16 String JDBC_URL_PROD = "jdbc.url.prod"; 17 String JDBC_USER_PROD = "jdbc.user.prod"; 18 String JDBC_PASSWORD_PROD = "jdbc.password.prod"; 19 String SPARK_LOCAL = "spark.local"; 20 String SPARK_LOCAL_TASKID_SESSION = "spark.local.taskid.session"; 21 String SPARK_LOCAL_TASKID_PAGE = "spark.local.taskid.page"; 22 String SPARK_LOCAL_TASKID_PRODUCT = "spark.local.taskid.product"; 23 String KAFKA_METADATA_BROKER_LIST = "kafka.metadata.broker.list"; 24 String KAFKA_TOPICS = "kafka.topics"; 25 26 /** 27 * Spark作業相關的常量 28 */ 29 String SPARK_APP_NAME_SESSION = "UserVisitSessionAnalyzeSpark"; 30 String SPARK_APP_NAME_PAGE = "PageOneStepConvertRateSpark"; 31 String FIELD_SESSION_ID = "sessionid"; 32 String FIELD_SEARCH_KEYWORDS = "searchKeywords"; 33 String FIELD_CLICK_CATEGORY_IDS = "clickCategoryIds"; 34 String FIELD_AGE = "age"; 35 String FIELD_PROFESSIONAL = "professional"; 36 String FIELD_CITY = "city"; 37 String FIELD_SEX = "sex"; 38 String FIELD_VISIT_LENGTH = "visitLength"; 39 String FIELD_STEP_LENGTH = "stepLength"; 40 String FIELD_START_TIME = "startTime"; 41 String FIELD_CLICK_COUNT = "clickCount"; 42 String FIELD_ORDER_COUNT = "orderCount"; 43 String FIELD_PAY_COUNT = "payCount"; 44 String FIELD_CATEGORY_ID = "categoryid"; 45 46 String SESSION_COUNT = "session_count"; 47 48 String TIME_PERIOD_1s_3s = "1s_3s"; 49 String TIME_PERIOD_4s_6s = "4s_6s"; 50 String TIME_PERIOD_7s_9s = "7s_9s"; 51 String TIME_PERIOD_10s_30s = "10s_30s"; 52 String TIME_PERIOD_30s_60s = "30s_60s"; 53 String TIME_PERIOD_1m_3m = "1m_3m"; 54 String TIME_PERIOD_3m_10m = "3m_10m"; 55 String TIME_PERIOD_10m_30m = "10m_30m"; 56 String TIME_PERIOD_30m = "30m"; 57 58 String STEP_PERIOD_1_3 = "1_3"; 59 String STEP_PERIOD_4_6 = "4_6"; 60 String STEP_PERIOD_7_9 = "7_9"; 61 String STEP_PERIOD_10_30 = "10_30"; 62 String STEP_PERIOD_30_60 = "30_60"; 63 String STEP_PERIOD_60 = "60"; 64 65 /** 66 * 任務相關的常量 67 */ 68 String PARAM_START_DATE = "startDate"; 69 String PARAM_END_DATE = "endDate"; 70 String PARAM_START_AGE = "startAge"; 71 String PARAM_END_AGE = "endAge"; 72 String PARAM_PROFESSIONALS = "professionals"; 73 String PARAM_CITIES = "cities"; 74 String PARAM_SEX = "sex"; 75 String PARAM_KEYWORDS = "keywords"; 76 String PARAM_CATEGORY_IDS = "categoryIds"; 77 String PARAM_TARGET_PAGE_FLOW = "targetPageFlow"; 78 79 }
2.3 時間日期工具類
DateUtils.java

1 import java.text.ParseException; 2 import java.text.SimpleDateFormat; 3 import java.util.Calendar; 4 import java.util.Date; 5 6 /** 7 * 時間日期工具類 8 * */ 9 public class DateUtils { 10 11 public static final SimpleDateFormat TIME_FORMAT = 12 new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 13 public static final SimpleDateFormat DATE_FORMAT = 14 new SimpleDateFormat("yyyy-MM-dd"); 15 public static final SimpleDateFormat DATEKEY_FORMAT = 16 new SimpleDateFormat("yyyyMMdd"); 17 18 /** 19 * 判斷第一個時間是否在第二個時間之前 20 * */ 21 public static boolean before(String firstTime,String secondTime){ 22 try { 23 Date first = TIME_FORMAT.parse(firstTime); 24 Date second = TIME_FORMAT.parse(secondTime); 25 26 if(first.before(second)){ 27 return true; 28 } 29 } catch (ParseException e) { 30 e.printStackTrace(); 31 } 32 return false; 33 } 34 35 /** 36 * 判斷第一個時間是否在第二個時間之后 37 * */ 38 public static boolean after(String firstTime,String secondTime){ 39 try { 40 Date first = TIME_FORMAT.parse(firstTime); 41 Date second = TIME_FORMAT.parse(secondTime); 42 43 if(first.after(second)){ 44 return true; 45 } 46 }catch (ParseException e){ 47 e.printStackTrace(); 48 } 49 return false; 50 } 51 52 /** 53 * 計算2個時間的差值(單位為秒) 54 * */ 55 public static int minus(String firstTime,String secondTime){ 56 try { 57 Date first = TIME_FORMAT.parse(firstTime); 58 Date second = TIME_FORMAT.parse(secondTime); 59 long millisecond = first.getTime() - second.getTime(); 60 return Integer.valueOf(String.valueOf(millisecond/1000)); 61 }catch (ParseException e){ 62 e.printStackTrace(); 63 } 64 return 0; 65 } 66 67 /** 68 * 獲取年月日和小時 69 * */ 70 public static String getDateHour(String datetime){ 71 String date = datetime.split(" ")[0]; 72 String hourMinuteSecond = datetime.split(" ")[1]; 73 String hour = hourMinuteSecond.split(":")[0]; 74 return date+"_"+hour; 75 } 76 77 /** 78 * 獲取當天的日期 79 * */ 80 public static String getTodayDate(){ 81 return DATE_FORMAT.format(new Date()); 82 } 83 84 /** 85 * 獲取昨天的日期 86 * */ 87 public static String getYesterdayDate(){ 88 Calendar calendar = Calendar.getInstance(); 89 calendar.setTime(new Date()); 90 calendar.add(Calendar.DAY_OF_YEAR,-1); 91 92 Date time = calendar.getTime(); 93 return DATE_FORMAT.format(time); 94 } 95 96 /** 97 * 格式化日期(yyyy-MM-dd) 98 */ 99 public static String formatDate(Date date) { 100 return DATE_FORMAT.format(date); 101 } 102 103 /** 104 * 格式化時間(yyyy-MM-dd HH:mm:ss) 105 */ 106 public static String formatTime(Date date) { 107 return TIME_FORMAT.format(date); 108 } 109 110 /** 111 * 解析時間字符串 112 */ 113 public static Date parseTime(String time) { 114 try { 115 return TIME_FORMAT.parse(time); 116 } catch (ParseException e) { 117 e.printStackTrace(); 118 } 119 return null; 120 } 121 122 /** 123 * 格式化日期key 124 */ 125 public static String formatDateKey(Date date) { 126 return DATEKEY_FORMAT.format(date); 127 } 128 129 /** 130 * 格式化日期key 131 */ 132 public static Date parseDateKey(String datekey) { 133 try { 134 return DATEKEY_FORMAT.parse(datekey); 135 } catch (ParseException e) { 136 e.printStackTrace(); 137 } 138 return null; 139 } 140 141 /** 142 * 格式化時間,保留到分鍾級別 143 */ 144 public static String formatTimeMinute(Date date) { 145 SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmm"); 146 return sdf.format(date); 147 } 148 }
2.4 數字格式化工具類
NumberUtils.java

1 import java.math.BigDecimal; 2 3 /** 4 * 數字格式化工具類 5 * @author Administrator 6 * 7 */ 8 public class NumberUtils { 9 10 /** 11 * 格式化小數 12 * @param num 字符串 13 * @param scale 四舍五入的位數 14 * @return 格式化小數 15 */ 16 public static double formatDouble(double num, int scale) { 17 BigDecimal bd = new BigDecimal(num); 18 return bd.setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue(); 19 } 20 21 }
2.5 參數工具類
ParamUtils.java

1 import com.alibaba.fastjson.JSONArray; 2 import com.alibaba.fastjson.JSONObject; 3 import com.bw.conf.ConfigurationManager; 4 import com.bw.constant.Constants; 5 6 7 /** 8 * 參數工具類 9 * @author Administrator 10 * 11 */ 12 public class ParamUtils { 13 14 /** 15 * 從命令行參數中提取任務id 16 * @param args 命令行參數 17 * @return 任務id 18 */ 19 public static Long getTaskIdFromArgs(String[] args, String taskType) { 20 boolean local = ConfigurationManager.getBoolean(Constants.SPARK_LOCAL); 21 22 if(local) { 23 return ConfigurationManager.getLong(taskType); 24 } else { 25 try { 26 if(args != null && args.length > 0) { 27 return Long.valueOf(args[0]); 28 } 29 } catch (Exception e) { 30 e.printStackTrace(); 31 } 32 } 33 34 return null; 35 } 36 37 /** 38 * 從JSON對象中提取參數 39 * @param jsonObject JSON對象 40 * @return 參數 41 */ 42 public static String getParam(JSONObject jsonObject, String field) { 43 JSONArray jsonArray = jsonObject.getJSONArray(field); 44 if(jsonArray != null && jsonArray.size() > 0) { 45 return jsonArray.getString(0); 46 } 47 return null; 48 } 49 50 }
2.6 字符串工具類
StringUtils.java

1 /** 2 * 字符串工具類 3 * @author Administrator 4 * 5 */ 6 public class StringUtils { 7 8 /** 9 * 判斷字符串是否為空 10 * @param str 字符串 11 * @return 是否為空 12 */ 13 public static boolean isEmpty(String str) { 14 return str == null || "".equals(str); 15 } 16 17 /** 18 * 判斷字符串是否不為空 19 * @param str 字符串 20 * @return 是否不為空 21 */ 22 public static boolean isNotEmpty(String str) { 23 return str != null && !"".equals(str); 24 } 25 26 /** 27 * 截斷字符串兩側的逗號 28 * @param str 字符串 29 * @return 字符串 30 */ 31 public static String trimComma(String str) { 32 if(str.startsWith(",")) { 33 str = str.substring(1); 34 } 35 if(str.endsWith(",")) { 36 str = str.substring(0, str.length() - 1); 37 } 38 return str; 39 } 40 41 /** 42 * 補全兩位數字 43 * @param str 44 * @return 45 */ 46 public static String fulfuill(String str) { 47 if(str.length() == 2) { 48 return str; 49 } else { 50 return "0" + str; 51 } 52 } 53 54 /** 55 * 從拼接的字符串中提取字段 56 * @param str 字符串 57 * @param delimiter 分隔符 58 * @param field 字段 59 * @return 字段值 60 */ 61 public static String getFieldFromConcatString(String str, 62 String delimiter, String field) { 63 try { 64 String[] fields = str.split(delimiter); 65 for(String concatField : fields) { 66 // searchKeywords=|clickCategoryIds=1,2,3 67 if(concatField.split("=").length == 2) { 68 String fieldName = concatField.split("=")[0]; 69 String fieldValue = concatField.split("=")[1]; 70 if(fieldName.equals(field)) { 71 return fieldValue; 72 } 73 } 74 } 75 } catch (Exception e) { 76 e.printStackTrace(); 77 } 78 return null; 79 } 80 81 /** 82 * 從拼接的字符串中給字段設置值 83 * @param str 字符串 84 * @param delimiter 分隔符 85 * @param field 字段名 86 * @param newFieldValue 新的field值 87 * @return 字段值 88 */ 89 public static String setFieldInConcatString(String str, 90 String delimiter, String field, String newFieldValue) { 91 String[] fields = str.split(delimiter); 92 93 for(int i = 0; i < fields.length; i++) { 94 String fieldName = fields[i].split("=")[0]; 95 if(fieldName.equals(field)) { 96 String concatField = fieldName + "=" + newFieldValue; 97 fields[i] = concatField; 98 break; 99 } 100 } 101 102 StringBuffer buffer = new StringBuffer(""); 103 for(int i = 0; i < fields.length; i++) { 104 buffer.append(fields[i]); 105 if(i < fields.length - 1) { 106 buffer.append("|"); 107 } 108 } 109 110 return buffer.toString(); 111 } 112 113 }
2.7 校驗工具類
ValidUtils.java

1 /** 2 * 校驗工具類 3 * @author Administrator 4 * 5 */ 6 public class ValidUtils { 7 8 /** 9 * 校驗數據中的指定字段,是否在指定范圍內 10 * @param data 數據 11 * @param dataField 數據字段 12 * @param parameter 參數 13 * @param startParamField 起始參數字段 14 * @param endParamField 結束參數字段 15 * @return 校驗結果 16 */ 17 public static boolean between(String data, String dataField, 18 String parameter, String startParamField, String endParamField) { 19 String startParamFieldStr = StringUtils.getFieldFromConcatString( 20 parameter, "\\|", startParamField); 21 String endParamFieldStr = StringUtils.getFieldFromConcatString( 22 parameter, "\\|", endParamField); 23 if(startParamFieldStr == null || endParamFieldStr == null) { 24 return true; 25 } 26 27 int startParamFieldValue = Integer.valueOf(startParamFieldStr); 28 int endParamFieldValue = Integer.valueOf(endParamFieldStr); 29 30 String dataFieldStr = StringUtils.getFieldFromConcatString( 31 data, "\\|", dataField); 32 if(dataFieldStr != null) { 33 int dataFieldValue = Integer.valueOf(dataFieldStr); 34 if(dataFieldValue >= startParamFieldValue && 35 dataFieldValue <= endParamFieldValue) { 36 return true; 37 } else { 38 return false; 39 } 40 } 41 42 return false; 43 } 44 45 /** 46 * 校驗數據中的指定字段,是否有值與參數字段的值相同 47 * @param data 數據 48 * @param dataField 數據字段 49 * @param parameter 參數 50 * @param paramField 參數字段 51 * @return 校驗結果 52 */ 53 public static boolean in(String data, String dataField, 54 String parameter, String paramField) { 55 String paramFieldValue = StringUtils.getFieldFromConcatString( 56 parameter, "\\|", paramField); 57 if(paramFieldValue == null) { 58 return true; 59 } 60 String[] paramFieldValueSplited = paramFieldValue.split(","); 61 62 String dataFieldValue = StringUtils.getFieldFromConcatString( 63 data, "\\|", dataField); 64 if(dataFieldValue != null) { 65 String[] dataFieldValueSplited = dataFieldValue.split(","); 66 67 for(String singleDataFieldValue : dataFieldValueSplited) { 68 for(String singleParamFieldValue : paramFieldValueSplited) { 69 if(singleDataFieldValue.equals(singleParamFieldValue)) { 70 return true; 71 } 72 } 73 } 74 } 75 76 return false; 77 } 78 79 /** 80 * 校驗數據中的指定字段,是否在指定范圍內 81 * @param data 數據 82 * @param dataField 數據字段 83 * @param parameter 參數 84 * @param paramField 參數字段 85 * @return 校驗結果 86 */ 87 public static boolean equal(String data, String dataField, 88 String parameter, String paramField) { 89 String paramFieldValue = StringUtils.getFieldFromConcatString( 90 parameter, "\\|", paramField); 91 if(paramFieldValue == null) { 92 return true; 93 } 94 95 String dataFieldValue = StringUtils.getFieldFromConcatString( 96 data, "\\|", dataField); 97 if(dataFieldValue != null) { 98 if(dataFieldValue.equals(paramFieldValue)) { 99 return true; 100 } 101 } 102 103 return false; 104 } 105 106 }