1.数据ETL综合案例()
需求:联想集团有一款app产品叫茄子快传(有上亿的活跃用户,集中在第三世界国家)
现在需要开发一个数据分析系统,来对app的用户行为数据做各类分析;
下面的是整个的过程:
涉及到MapReduce和Hive的只有数据清洗和Hive的运算处理
需求
{
"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" 系统所使用语言
}
}
1、数据预处理(数据清洗)
--》 release_channel,device_id,city,device_id_type,app_ver_name 这几个字段如果缺失,则过滤
--》 将数据整成 字段,字段,字段,...... 这种形式
--》 在每条数据中添加一个字段:user_id(值就是device_id)
2、导入hive中的表的天分区
每天的活跃用户,新增用户
3、进行数据统计分析
每天的新增用户 --》 事实
维度 --》 各种组合
版本 渠道 城市 设备 新增用户数
所有 所有 所有 所有 21949382
所有 所有 所有 具体设备 xxx
所有 所有 具体城市 所有 yyyy
所有 具体渠道 所有 所有 yyyy
具体版本 所有 所有 所有 zzz
具体版本 具体渠道 所有 所有 zzz
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111
1.数据清洗
import java.io.IOException;
import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
/**
* 用来清理log日志信息的
*
* @author