流程圖: android
「events」: 「1473367236143\u00010\u0001connectByQRCode\u0001\u00010\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u00011609072239570000027\u0001\n1473367261933\u00010\u0001AppLaunch\u0001\u00010\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u00011609072239570000028\u0001\n1473367280349\u00010\u0001connectByQRCode\u0001\u00010\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u00011609072239570000029\u0001\n1473367331326\u00010\u0001AppLaunch\u0001\u00010\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u00011609072239570000030\u0001\n1473367353310\u00010\u0001connectByQRCode\u0001\u00010\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u00011609072239570000031\u0001\n1473367387087\u00010\u0001AppLaunch\u0001\u00010\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u00011609072239570000032\u0001\n1473367402167\u00010\u0001connectByQRCode\u0001\u00010\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u00011609072239570000033\u0001\n1473367451994\u00010\u0001AppLaunch\u0001\u00010\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u00011609072239570000034\u0001\n1473367474316\u00010\u0001connectByQRCode\u0001\u00010\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u00011609072239570000035\u0001\n1473367564181\u00010\u0001AppLaunch\u0001\u00010\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u00011609072239570000036\u0001\n1473367589527\u00010\u0001connectByQRCode\u0001\u00010\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u00011609072239570000037\u0001\n1473367610310\u00010\u0001AppLaunch\u0001\u00010\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u00011609072239570000038\u0001\n1473367624647\u00010\u0001connectByQRCode\u0001\u00010\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u00011609072239570000039\u0001\n1473368004298\u00010\u0001AppLaunch\u0001\u00010\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u00011609072239570000040\u0001\n1473368017851\u00010\u0001connectByQRCode\u0001\u00010\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u00011609072239570000041\u0001\n1473369599067\u00010\u0001AppLaunch\u0001\u00010\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u00011609072239570000042\u0001\n1473369622274\u00010\u0001connectByQRCode\u0001\u00010\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u0001\u00011609072239570000043\u0001\n」,ios
使用json在線解析器解析爲:
「header」: {
「cid_sn」: 「1501004207EE98AA」, sdn碼
「mobile_data_type」: 「」,
「os_ver」: 「9」, 操做系統
「mac」: 「88:1f:a1:03:7d:a8」, 物理地址
「resolution」: 「2560x1337」, 分辨率
「commit_time」: 「1473399829041」, 提交時間
「sdk_ver」: 「103」, sdk版本
「device_id_type」: 「mac」, 設備類型
「city」: 「江門市」, 城市
「android_id」: 「」, 安卓設備的安卓id
「device_model」: 「MacBookPro11,1」,設備型號
「carrier」: 「中國xx」, 運營商
「promotion_channel」: 「1」, 推廣渠道
「app_ver_name」: 「1.7」, app版本號
「imei」: 「」, 入網表示
「app_ver_code」: 「23」, 公司內部版本碼
「pid」: 「pid」,
「net_type」: 「3」, 網絡類型
「device_id」: 「m.88:1f:a1:03:7d:a8」, 設備ip
「app_device_id」: 「m.88:1f:a1:03:7d:a8」,
「release_channel」: 「appstore」, 發佈渠道
「country」: 「CN」,
「time_zone」: 「28800000」, 時區編碼
「os_name」: 「ios」, 操做系統類型
「manufacture」: 「apple」, 生產廠家
「commit_id」: 「fde7ee2e48494b24bf3599771d7c2a78」, 事件標示
「app_token」: 「XIAONIU_I」, app標示
「account」: 「none」, 登錄帳號
「app_id」: 「com.appid.xiaoniu」, app組名
「build_num」: 「YVF6R16303000403」, 編譯號
「language」: 「zh」 系統所使用語言
}
}json
一、 數據清理需求分析
release_channel,device_id,city,device_id_type,app_ver_name 這幾個字段若是缺失,則過濾
將數據整成 字段,字段,字段,…… 這種形式
在每條數據中添加一個字段:user_id(值就是mac)
二、數據清理代碼markdown
public class AppLogClean {
public static class MapTask extends Mapper<LongWritable, Text, Text, NullWritable> {
StringBuilder sb = new StringBuilder(); Text k = new Text(); @Override protected void map(LongWritable key, Text value, Mapper<LongWritable, Text, Text, NullWritable>.Context context) throws IOException, InterruptedException { // 獲得每行數據 String line = value.toString(); JSONObject ob1 = JSON.parseObject(line); JSONObject ob2 = ob1.getJSONObject("header"); // 關鍵數據是否有丟失 // release_channel,device_id,city,device_id_type,app_ver_name // 這幾個字段若是缺失,則過濾 if (StringUtils.isBlank(ob2.getString("release_channel")) || StringUtils.isBlank(ob2.getString("device_id")) || StringUtils.isBlank(ob2.getString("city")) || StringUtils.isBlank(ob2.getString("device_id_type")) || StringUtils.isBlank(ob2.getString("app_ver_name")) || StringUtils.isBlank(ob2.getString("os_name")) || StringUtils.isBlank(ob2.getString("mac"))) { return; } if (ob2.getString("app_ver_name").equals("android")) { if (StringUtils.isBlank(ob2.getString("android_id"))) { return; } } sb.append(ob2.getString("cid_sn")).append(","); sb.append(ob2.getString("mobile_data_type")).append(","); sb.append(ob2.getString("os_ver")).append(","); sb.append(ob2.getString("mac")).append(","); sb.append(ob2.getString("resolution")).append(","); sb.append(ob2.getString("commit_time")).append(","); sb.append(ob2.getString("sdk_ver")).append(","); sb.append(ob2.getString("device_id_type")).append(","); sb.append(ob2.getString("city")).append(","); sb.append(ob2.getString("android_id")).append(","); sb.append(ob2.getString("device_model")).append(","); sb.append(ob2.getString("carrier")).append(","); sb.append(ob2.getString("promotion_channel")).append(","); sb.append(ob2.getString("app_ver_name")).append(","); sb.append(ob2.getString("imei")).append(","); sb.append(ob2.getString("app_ver_code")).append(","); sb.append(ob2.getString("pid")).append(","); sb.append(ob2.getString("net_type")).append(","); sb.append(ob2.getString("device_id")).append(","); sb.append(ob2.getString("app_device_id")).append(","); sb.append(ob2.getString("release_channel")).append(","); sb.append(ob2.getString("country")).append(","); sb.append(ob2.getString("time_zone")).append(","); sb.append(ob2.getString("os_name")).append(","); sb.append(ob2.getString("manufacture")).append(","); sb.append(ob2.getString("commit_id")).append(","); sb.append(ob2.getString("app_token")).append(","); sb.append(ob2.getString("account")).append(","); sb.append(ob2.getString("app_id")).append(","); sb.append(ob2.getString("build_num")).append(","); sb.append(ob2.getString("language")).append(","); String uid = ob2.getString("mac");//??? sb.append(uid); k.set(sb.toString()); context.write(k, NullWritable.get()); //清除sb的數據 sb.delete(0, sb.length()); } } public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); Job job = Job.getInstance(conf); //設置map,設置driver,設置輸出類型。。。 job.setJarByClass(AppLogClean.class); job