数据查询服务介绍及优化点整理

本文介绍了数据查询服务(DQS)的目的、结构,并详细梳理了其业务流向和优化点。优化主要包括参数转换的统一、代码冗余的减少以及缓存依赖查询引擎的改进。通过这些优化,DQS能更好地支持数据分析模型查询,提高效率并降低维护成本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DQS介绍及优化点整理

1. 数据查询服务目的

​ 为支撑G数数据分析平台以及其它平台(广告系统,G库数据页查询)等系统的复杂数据查询需求,而提供的一套“数据查询”解决方案。数据查询服务经过一段时间的开发,功能上也得到了相对的完善。目前数据查询服务已经支持 以“G数数据集配置”各 数据分析模型(事件分析、留存分析、分布分析、漏斗分析、自定义分析、用户分析)方式查询数据,也支持以服务内置模板配置 方式查询数据(“模板配置”的查询逐渐被前者替代),从而来满足我们公司日常的数据查询业务需求。

2. 数据查询服务结构

数据查询各模块介绍
dqs服务
  1. 参数转换和组装
  2. 控制数据查询缓存策略
  3. 查询的整体调度:调用sql-buidler生成具体的数据查询sql语句,调用eql-engine用sql语句获取数据结果
  4. 数据清洗:根据业务对查询出的数据做清洗,获取最终的业务数据。
sql-builder服务
  1. 接收到dsq服务构建sql语句的请求,策略模式找到对应的构建器去构建
  2. 找到对应的构建sql模板,解释器去融合模板占位符和请求参数值的组装
  3. 生产具体的sql语句
  4. sql语句给到dqs服务
eql-engine服务
  1. 缓存查询,是否命中缓存,检查缓存是否过期
  2. 查询impala数据相关数据
  3. 根据缓存策略更新缓存
  4. 数据给到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. 时间转换

(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. 全局过滤条件

    (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());
    }
    
  2. 指标过滤条件
    (1&#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值