这几天复习计网的东西去了~~不定期更新 之所以单独将这个主题宽表拿出来讲,是因为他的设计过程非常具有代表性,可以参照这个表的设计方式去实现后续其他的主题宽表设计(后续有Flink Sql的实现过程、另讲); 在该系列的第一篇文章中,我已经提高了各个层的设计目的;DWS层在本项目中的主要作用是为了ADS层的查询和后续可视化设计的,算是数据接口的直接数据来源,所以这里对实时性的要求很高,否则你再这里算个几十秒的延迟,最后展示出来的数据结果实时性肯定非常差; 对此,DWS层的设计应该突出实时性要求,在这里,不应该出现大批量的明细数据,而应该是针对可视化所需的主题宽表数据;同时,我们选用clickhouse数据库来做一个实时查询,实际上在OLAP中clickhouse的优势是非常明显的,因为其单表查询的能力非常强,速度很快,而我们在这里最好了主题宽表之后,也不需要再做联表查询,正好适合clickhouse来发挥作用;  目前我们已经获得了访客主题宽表所需要的各个单表的内容,接下来就是分析具体这个主题宽表需要哪些字段了; 对DWS层的表而言,我们一般从两个角度来设计:维度和度量,这里我们这两个概念做一个简要介绍:
维度:即观察数据的角度.比如员工数据,可以从性别角度来分析,也可以更加细化,从入职时间或者地区的维度来观察.维度是一组离散的值;
比如说性别中的男和女,或者时间维度上的每一个独立的日期.因此在统计时可以将维度值相同的记录聚合在一起,然后应用聚合函数做累加/平均/最大和最小值等聚合计算.
度量:即被聚合(观察)的统计值,也就是聚合运算的结果.比如说员工数据中不同性别员工的人数,又或者说在同一年入职的员工有多少.
根据我们所需的需求指标以及之后我们需要做可视化时候的一些维度,我们得出下列结论: 度量包括 PV、UV、跳出次数、进入页面数(session_count)、连续访问时长 维度包括在分析中比较重要的几个字段:渠道、地区、版本、新老用户进行聚合;(其实最后在处理完这些数据字段之后,我们还添加上了窗口时间,这是为了方便做数据分析时候,能快速得到时间段内数据内容) 其中度量数据的计算我们可以通过把对应的数据源流中的对应字段内容标记为1(具体设计见Bean类,这里应该不难理解),运用wordCount的思想来进行一个聚合统计,这样最后我们开窗统计的时候,就能知道对应窗口中数据的统计数目了; 我们以PV流为例来做一个简要介绍:
SingleOutputStreamOperator<VisitorStats> pvStatsDS = pvJsonStrDS.map(
new MapFunction<String, VisitorStats>() {
@Override
public VisitorStats map(String jsonStr) throws Exception {
JSONObject jsonObj = JSON.parseObject(jsonStr);
VisitorStats visitorStats = new VisitorStats(
"",
"",
jsonObj.getJSONObject("common").getString("vc"),
jsonObj.getJSONObject("common").getString("ch"),
jsonObj.getJSONObject("common").getString("ar"),
jsonObj.getJSONObject("common").getString("is_new"),
0L,
1L,
0L,
0L,
jsonObj.getJSONObject("page").getLong("during_time"),
jsonObj.getLong("ts")
);
return visitorStats;
}
}
);
接下来就是正常的union合并流以及事件时间戳的设置,按照我们之前确定好的维度进行分组,开窗聚合(这里的代码我就不讲了,太常见了);记得通过Context对象来获取窗口的时间,并一起输出出去;
|