DQS介绍及优化点整理
1. 数据查询服务目的
为支撑G数数据分析平台以及其它平台(广告系统,G库数据页查询)等系统的复杂数据查询需求,而提供的一套“数据查询”解决方案。数据查询服务经过一段时间的开发,功能上也得到了相对的完善。目前数据查询服务已经支持 以“G数数据集配置”各 数据分析模型(事件分析、留存分析、分布分析、漏斗分析、自定义分析、用户分析)方式查询数据,也支持以服务内置模板配置 方式查询数据(“模板配置”的查询逐渐被前者替代),从而来满足我们公司日常的数据查询业务需求。
2. 数据查询服务结构
数据查询各模块介绍
dqs服务
- 参数转换和组装
- 控制数据查询缓存策略
- 查询的整体调度:调用sql-buidler生成具体的数据查询sql语句,调用eql-engine用sql语句获取数据结果
- 数据清洗:根据业务对查询出的数据做清洗,获取最终的业务数据。
sql-builder服务
- 接收到dsq服务构建sql语句的请求,策略模式找到对应的构建器去构建
- 找到对应的构建sql模板,解释器去融合模板占位符和请求参数值的组装
- 生产具体的sql语句
- sql语句给到dqs服务
eql-engine服务
- 缓存查询,是否命中缓存,检查缓存是否过期
- 查询impala数据相关数据
- 根据缓存策略更新缓存
- 数据给到dqs服务
数据查询服务架构图
数据查询业务流程图
3. DQS服务业务流向
主要支持 G库数据集和数据页配置标准数据分析模型(事件分析、留存分析、分布分析、漏斗分析、自定义分析、用户分析)查询 与 老的模板配置查询 两种方式查询。
模板配置查询
“模板配置”方式 支持两种配置方式:一种无页面配置,只是查询数据使用。另一种是页面元数据、查询数据都需要配置的。
(1)模板配置–查询页面元数据流程:
(2)模板配置–查询数据流程:
分析模型查询
数据分析模型包含了事件分析、留存分析、分布分析、漏斗分析、自定义分析、用户分析等模型数据查询主要交互流程:
4.DQS服务优化项汇总
优化项一:参数转换
问题描述:
各数据分析模型 由“前端” 传入“dqs” 的参数 和 “dqs”调用“sql-builder”生成sql时,sql-builder所需的参数,两个服务接收的参数大部分含义相同。但是由于参数名称或参数值的标识不一样,导致目前 dqs在调用 sql-builder 之前,需要把 前端传给dqs的参数 再转换成 sql-builder 对应的参数才行。
留存分析“参数转换”相关代码行数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QtmFNTFH-1626685049713)(images/分析模型参数处理例子2.png)]
代码示例(差异点)
事件分析“参数转换”代码片断:
- 时间转换
(1)时间参数结构不一致,前端传入“动态时间” 参数放在数组中,“静态时间” 参数则放在另外两个字段中,dqs需要根据时间类型分别去不同地方拿相应参数,然后传给sql-builder
(2)时间类型不一致,前端传入时间类型以“数字”标识,sql-builder则以“枚举”类型标识
Filter dateFilter = dateFilterOpt.get();
QueryDate.QueryDateBuilder queryDate = QueryDate.builder();
if (dateFilter.getTimeType() == 1) {
if (dateFilter.isDynamicTime()) {
Filter.DynamicTimeParam dtp = dateFilter.getDynamicTimeParam();
queryDate.type(QueryDate.Type.DYNAMIC).start(dtp.getTime()[0]).end(dtp.getTime()[1]);
} else {
queryDate
.type(QueryDate.Type.STATIC)
.start(dateFilter.getFromDate())
.end(dateFilter.getToDate());
}
if (!CollectionUtils.isEmpty(dateFilter.getCompares())) {
queryDate.compares(dateFilter.getCompares().toArray(new String[0]));
}
} else if (dateFilter.getTimeType() == 2) {
request.setFreq(Frequency.openday);
queryDate
.type(QueryDate.Type.SERVER)
.start(dateFilter.getFromDate())
.end(dateFilter.getToDate());
} else {
throw new RuntimeException("定义的时间类型不支持[" + dateFilter.getTimeType() + "]");
}
-
全局过滤条件
(1)用户群属性需要加计算版本
(2)用户群属性需要设置eventName为“ug”,sql-builder需要特殊处理。
(3)除用户群外,非对象属性:事件属性、时间、服务器 需设置对象、事件为any
String field = f.getField(); if (f.getFieldType() == 2) { field = field + ":" + f.getCalcVersion(); } com.iwgame.bigdata.sqlbuilder.model.Filter filter = new com.iwgame.bigdata.sqlbuilder.model.Filter( field, f.getOp(), f.getParams()); if (f.getFieldType() != 5) { if (f.getFieldType() == 2) { filter.getOperator().setEventName("ug"); filter.getOperator().setObjectName("any"); } else { filter.getOperator().setEventName("any"); filter.getOperator().setObjectName("any"); } } else { filter.getOperator().setEventName(null); filter.getOperator().setObjectName(f.getObjectName()); }
-
指标过滤条件
(1&#