1. 项目架构
2. ETL数据清洗
2.1. Flume拦截器
2.2. ods层->dwd层
原始数据层->明细数据层
通过定义UDF和UDTF函数对数据进行简单清洗,保持数据粒度一致。
1.UDF函数做清洗:如图所示,用服务器时间后的“|”对字符串做切割,如果切割出来的不是两个部分,则直接返回空字符串。
2.UDTF函数做清洗:过滤空数据——如果传入的et为空,直接返回不要。
3. org.json.JSONObject
处理如下所示的JSON格式数据:
{
"cm":{
"ln":"-70.1",
"sv":"V2.5.2"
},
"ap":"gmall"
}
[{
"ett":"12345123",
"en":"loading",
"kv":{
"type":"1",
"type1":""
},
{
...
}
}]
import org.json.JSONException;
import org.json.JSONObject;
public class TestJson {
public static void main(String[] args) {
String json = "{\"cm\":{\"ln\":\"-70.1\",\"sv\":\"V2.5.2\"},\"ap\":\"gmall\"}";
try {
JSONObject jsonObject = new JSONObject(json);
JSONObject cm = jsonObject.getJSONObject("cm");
String ln = cm.getString("ln");
System.out.println(ln);
} catch (JSONException e) {
e.printStackTrace();
}
String json2 = "[{\"ett\":\"12345123\", \"en\":\"loading\", \"kv\":{\"type\":\"1\",\"type1\":\"\" }}]";
try {
JSONArray jsonArray = new JSONArray(json2);
System.out.println(jsonArray.length());
String string = jsonArray.getJSONObject(0).getJSONObject("kv").getString("type");
System.out.println(string);
} catch (JSONException e) {
e.printStackTrace();
}
}
}
4. 数据仓库
4.1. 数据仓库与关系型数据库的区别
特性 | 数据库 | 数据仓库 |
---|---|---|
数据 | 在线交易数据,面向事务设计 | 历史数据,面向主题设计 |
冗余 | 避免冗余 | 引入冗余 |
面向 | 业务操作 | 数据分析 |
存取 | 读写操作 | 主要为读取 |
使用频率 | 高 | 低 |
要求响应时间 | 较短 | 可以很长 |
4.2. 数据分仓的优点缺点
优点:
- 把复杂问题简单化
将一个复杂的问题分解为多个步骤来完成,每层只处理单一的步骤,比较简单,并且方便定位问题。
- 减少重复开发
规范数据分层,通过中间层数据,能够减少极大的重复计算,增加一次计算结果的复用性。
- 隔离原始数据
不论是数据的异常还是数据的敏感性,使真实数据与统计数据解耦。
缺点:
- 产生大量的冗余数据
4.3. 具体分层
ods:原始数据层——存放原始数据,保持数据原貌不作处理
dwd:明细数据层——结构、粒度与原始表保持一致,对ODS层进行清洗(去除空值、脏数据、超范围的数据)
dws:服务数据层——以DWD层为基础,进行轻度汇总
ads:数据应用层——ADS层,为各种统计报表提供数据
4.4. OLAP和OLTP
OLAP:On-Line transaction processing,联机事务处理
OLTP:On-Line Analytical Processing,联机分析处理
OLAP:是数据仓库的主要应用,支持复杂的分析操作,侧重决策,并提供直观易懂的查询结果。强调数据分析,强调SQL执行时长,强调磁盘I/O,强调分区。
OLTP:是传统的关系型数据库的主要应用,是基本的日常的事务处理,如银行交易。强调数据库内存效率,强调内存各种指标的命令率,强调并发操作。