昨晚又为“DAU”吵到凌晨三点,我决定掀桌子了

11 阅读8分钟

凌晨三点,报警群又炸了。不是 OOM,也不是任务失败,而是一条来自业务方的@:“为什么 BI 报表里的 DAU 和运营后台的对不上?明天大老板要看,赶紧查!”

我揉着发红的眼睛,心里一万只羊驼奔腾而过。这已经是本月第三次了。我熟练地打开 IDE,开始翻找那几十个名为 dws_user_active_* 和 ads_report_dau_* 的宽表,试图找出哪个表的哪个字段的哪个过滤条件,又被哪个业务方“灵活”地改动了。

查了一宿,最后发现是市场部为了做活动复盘,临时在某个 ETL 任务里加了个 AND channel = 'campaign' 的限定,而这张宽表恰好又被运营的报表引用了。口径又双叒叕不一致了。

那一刻,我盯着满屏的 SQL,突然悟了:公司里那几百个含义模糊的“DAU”,根本不是我们数据开发能力不行,而是这套“数仓+BI”的玩法,从根儿上就注定会产出这种“数据垃圾”。

一、指标混乱:不是管理事故,是架构的“工伤”

很多人把指标口径对不上归咎于“管理混乱”、“部门墙”。太天真了。这就像怪流水线上的工人为什么造不出法拉利一样。

在经典的数据仓库范式里,流程是线性的、物理的:

  1. 业务提需求:“我要看按渠道分的 DAU。”
  2. 数据开发写 SQL:CREATE TABLE ads_dau_by_channel AS SELECT ...,吭哧吭哧跑ETL。
  3. BI 连表出报表:Fine。

看起来没问题,对吧?但问题就出在第二步的 “物理化” 上。每一个新的分析视角(按渠道、按版本、按用户等级…),每一个临时的业务限定(仅付费用户、仅新用户…),都需要一张新的物理宽表(DWS/ADS)来承载。

指标的逻辑,被硬编码进了成千上万张表的表结构和 SQL 里。

这就导致了数据分析的“不可能三角”:

  • 口径一致:难。改个业务规则,得翻出所有相关宽表,改 SQL,重跑历史数据,成本高到你想摆烂。
  • 响应敏捷:难。新需求一来,排期、开发、测试、上线,一周过去了,业务黄花菜都凉了。
  • 深度洞察:难。宽表维度是预定的,你想临时换个维度下钻?对不起,没宽表,要么等排期,要么自己写临时查询(又造出一个新口径)。

所以,几百个 DAU 不是 bug,是这套架构设计下的 feature。

二、NoETL?别吹牛,让我看看你的“语义编织”怎么玩

被“DAU”折磨到秃头后,我开始找解药。市面上各种“指标平台”、“Headless BI”概念满天飞,核心都在讲一个东西:统一语义层。

说白了,就是要把指标的业务逻辑定义,从物理宽表的开发中解耦出来。

最近深度体验了 Aloudata CAN 这个产品,它主打 “NoETL 语义编织” 。名字挺唬人,我一开始也以为是噱头。但拆开看,它的设计思路确实有点东西,跟我们传统的玩法完全反着来。

画了个图,大家凑合看,逻辑大概是这样:

ge.png

核心就三步,但每一步都反直觉:

  1. 不先Join,先“声明关联” 传统做法:为了分析用户订单,我得先把 user表 和 order表 用 user_id 提前Join好,做成一张大宽表 dws_user_order。 NoETL做法:在语义层里,我只需要声明:“user表 和 order表 可以通过 user_id 关联”。这是一种逻辑关系,不产生物理数据。相当于在 DWD 层之上,虚拟出了一张无限大的“业务事实网络”。

  2. 定义指标,不是写 SQL,是“拼乐高” 传统做法:在宽表 ads_dau_by_channel 的 SQL 里写死:COUNT(DISTINCT CASE WHEN is_paid=1 THEN user_id END)。 NoETL 做法:在界面里,像搭积木一样组合:

  • 度量:COUNT(DISTINCT user_id)
  • 限定:is_paid = 1
  • 统计周期:最近 1 天
  • 衍生计算:同比/环比

组合出一个叫 “付费 DAU” 的逻辑指标。定义即完成开发,不需要跑 ETL 任务生成新表。

  1. 查询时,才“编织”与“加速” 当业务在 BI 里拖拽这个“付费 DAU”时,平台背后的语义引擎才开始工作:
  • 逻辑 SQL 生成:根据你的声明,自动生成访问底层 DWD 明细表的 SQL。比如,它会自动把 user表 和 order表 按需关联起来。
  • 智能路由:系统会根据查询模式(比如这个“付费 DAU”经常被按天查询),按策略自动物化出一些聚合结果(物化视图)。下次查询时,引擎会智能判断是直接扫描物化视图快,还是实时关联明细快,自动选择最优路径。

所以,它真的“NoETL”吗? 不完全算文字游戏。它“No”掉的是为了分析而进行的、手工的、烟囱式的 ETL 开发。但物化加速这个过程,本身也是一种 ETL(Extract, Transform, Load)。只不过这个 ETL 是系统根据你的逻辑声明自动完成的,对业务和开发者透明。这其实是把最脏最累的宽表开发运维工作,从人身上转移给了系统。

三、对我们一线开发来说,这玩意儿香不香?

抛开概念,说点实在的。这套架构如果能落地,对我们这些“SQL 纺织工”意味着什么?

  1. 告别人肉宽表维护 新需求来了?不用写 CREATE TABLE ... AS SELECT ... 了。去语义层配一下逻辑,业务马上就能用。业务规则变了?改一下逻辑定义,所有基于这个指标的报表口径自动同步更新。历史数据对比失真?不存在的,因为计算始终基于最新的逻辑和原始的明细数据。

  2. 根治“ChatBI 幻觉” 现在搞 AI 问数,最怕大模型乱写 SQL。根本原因是它不懂你混乱的业务口径。统一语义层相当于给 AI 提供了一个 “标准答案库”(语义知识图谱)。AI 问数流程变成了:用户提问 → AI理解后,从标准指标库里挑选匹配的指标(生成 MQL) → 语义引擎将 MQL 翻译成 100% 准确的 SQL。把生成 SQL 的“开放题”,变成了选择标准指标的“选择题”,准确率自然飙升。

  3. 解放生产力,但也面临新挑战

  • 爽点:能省下大量写重复宽表 SQL 的时间,去搞更有价值的性能优化或数据模型设计。业务自助分析能力变强,取数需求压力骤减。

  • 挑战:

    • 明细层数据质量要求极高:所有计算都回溯到 DWD,这里数据脏一点,影响的就是所有指标。
    • 逻辑建模能力要求更高:不再是单纯的 SQL Boy了,需要更深入地理解业务,抽象出合理的实体、关系和逻辑指标。这其实是好事,逼着我们往上走。
    • 性能天花板待测试:虽然有意向谓词下推、智能物化等优化,但在 PB 级数据、超高并发、特别复杂的多表关联场景下,性能能否依然坚挺,需要实际压测。

四、怎么上车?别想着“推翻重来”

最怕老板一看这文章,明天就让“全面迁移”。那真是灾难。

比较靠谱的落地姿势是 “三步走”,这也是我们团队在规划的:

  1. 存量挂载:别动现有的宽表。先把那些核心的、稳定的宽表,作为“物理数据源”挂到指标平台后面。让业务先通过统一的 API/BI 连接来访问,统一出口,感受一下。
  2. 增量原生:所有新的分析需求,强制要求不再建新宽表。必须基于 DWD 明细,在语义层上定义逻辑指标来完成。从源头遏制宽表泛滥。
  3. 存量替旧:对于那些维护成本巨高、天天被抱怨的旧宽表,逐步安排迁移,用新的逻辑指标替代。平滑演进,风险可控。

写在最后

折腾了一晚上,我算是明白了。公司里那几百个混乱的 DAU,就像满地的蟑螂。你一只只去拍(改 SQL),永远拍不完。真正要做的,是找到蟑螂窝(烟囱式架构),并把它端掉。

NoETL 语义编织和统一指标平台,提供的就是一种“端掉蟑螂窝”的新思路。它不一定适合所有场景,但绝对是解决“指标口径”这个世纪难题,目前我看到的最有希望的方向。

把跟业务吵架、熬夜改宽表的时间,省下来去钓鱼不香吗? 这个工具和它背后的架构思想,值得每一个被“DAU”折磨的数据开发,认真研究一下。

(链接我就不放了,搜 Aloudata 应该能找到。建议先拿个边缘业务或者新需求跑个 POC,感受一下是不是真的“No”得起来。)