LOD 表达式在数据分析领域很常用,其全称为 Level Of Detail,即详细级别。

精读

什么是详细级别,为什么需要 LOD?你一定会有这个问题,我们来一步步解答。

什么是详细级别

可以尝试这么发问:你这个数据有多详细?

得到的回答可能是:

  1. 数据是汇总的,抱歉看不到细节,不过如果您正好要看总销量的话,这儿都给您汇总好了。。

  2. 详细?这直接就是原始表数据,30 亿条,这够详细了吧?如果觉得还不够详细,那只好把业务过程再拆分一下重新埋点了。

详细程度越高,数据量越大,详细程度越低,数据就越少,就越是汇总的数据。

人很难在详细程度很高的 30 亿条记录里看到有价值的信息,所以数据分析的过程也可以看作是 对数据汇总计算的过程,这背后数据详细程度在逐渐降低

BI 工具的详细级别

如果没有 LOD 表达式,一个 BI 查询的详细程度是完全固定的:

  • 如果表格拖入度量,没有维度,那就是最高详细级别,因为最终只会汇总出一条记录。

  • 如果折线图拖入维度,那结果就是根据这个维度内分别聚合度量,数据更详细了,详细粒度为当前维度,比如日期。

如果我们要更详细的数据,就需要在维度上拖入更多字段,直到达到最详细的明细表级别的粒度。然而同一个查询不可能包含不同详细粒度,因为详细粒度由维度组合决定,不可改变,比如下面表格的例子:

行:国家 省 城市
列:GDP

这个例子中,详细级别限定在了城市这一级汇总,城市下更细粒度的数据就看不到了,每一条数据都是城市粒度的,我们不可能让查询结果里出现按照国家汇总的 GDP,或者看到更详细粒度的每月 GDP 信息,更不可能让城市粒度的 GDP 与国家粒度 GDP 在一起做计算,算出城市 GDP 在国家中占比。

但是,类似上面例子的需求是很多的,而且很常见,BI 工具必须想出一种解法,因此诞生了 LOD:LOD 就是一种表达式,允许我们在一个查询中描述不同的详细粒度

从表达式计算来看详细级别

表达式计算必须限定在同样的详细粒度,这是铁律,为什么呢?

试想一下下面两张不同详细粒度的表:

总销售额

10000

各城市销售额

北京 3000
上海 7000

如果我们想在各城市销售额中,计算贡献占比,那么就要写出 [各城市销售额] / [总销售额] 的计算公式,但显然这是不可能的,因为前者有两条数据,后者只有一条数据,根本无法计算。

我们能做的一定是数据行数相同,那么无论是 IF ELSE、CASE WHEN,还是加减乘除都可以按照行粒度进行了。

LOD 给了我们跨详细粒度计算的能力,其本质还是将数据详细粒度统一,但我们可以让某列数据来自于一个完全不同详细级别的计算:

城市 销售额 总销售额
北京 3000  10000
上海 7000  10000

如图表,LOD 可以把数据加工成这样,即虽然总销售额与城市详细粒度不同,但还是添加到了每一行的末尾,这样就可以进行计算了。

因此 LOD 可以按照任意详细级别进行计算,将最终产出 “贴合” 到当前查询的详细级别中。

LOD 表达式分为三种能力,分别是 FIXED、INCLUDE、EXCLUDE。

FIXED

{ fixed [省份] : sum([GDP]) }

按照城市这个固定详细粒度,计算每个省份的 DGP,最后合并到当前详细粒度里。

假如现在的查询粒度是省份、城市,那么 LOD 字段的添加逻辑如下图所示:

可见,本质是两个不同 sql 查询后 join 的结果,内部的 sum 表示在 FIXED 表达式内的聚合方式,外部的 sum 表示,如果 FIXED 详细级别比当前视图详细级别低,应该如何聚合。在这个例子中,FIXED 详细级别较高,所以 sum 不起作用,换成 avg 效果也相同,因为合并详细级别是,是一对多关系,只有合并时多对一关系才需要聚合。

最外层聚合方式一般在 INCLUDE 表达式中发挥作用。

EXCLUDE

{ exclude [城市] : sum([GDP]) }

在当前查询粒度中,排除城市这个粒度后计算 GDP,最后合并到当前详细粒度中。

假如现在的查询粒度是省份、城市、季节,那么 LOD 字段的添加逻辑如下图所示:

如图所示,EXCLUDE 在当前视图详细级别的基础上,排除一些维度,所得到的详细级别一定会更高。

INCLUDE

{ include [城乡] : avg([GDP]) }

在当前查询粒度中,额外加上城乡这个粒度后计算 GDP,最后合并到当前详细粒度中。

这类的例子比较难理解,且在 sum 情况下一般无实际意义,因为计算结果不会有差异,必须在类似 avg 场景下才有意义,我们还是结合下图来看:

这就是 avg 算不准的问题,即不同详细级别计算的平均值是不同的,但 sum、count 等不会随着详细级别变化而影响计算结果,所以当涉及到 avg 计算时,可以通过 INCLUDE 表达式指定计算的详细级别,以保证数据口径准确性。

LOD 字段怎么用

除了上面的例子中,直接查出来展示给用户外,LOD 字段更常用的是作为中间计算过程,比如计算省份 GDP 占在国内占比。因为 LOD 已经将不同详细粒度计算结果合并到了当前的详细粒度里,所以如下的计算表达式:

sum([GDP]) / sum({ fixed [国家] : sum([GDP]) })

看似是跨详细粒度计算,其实没有,实际计算时还是一行一行来算的,后面的 LOD 表达式只是在逻辑上按照指定的详细粒度计算,但最终会保持与当前视图详细粒度一致,因此可以参与计算。

我们后面会继续解读 tableau 整理的 Top 15 LOD 表达式业务场景,更深入的理解 LOD 表达式。

总结

LOD 表达式让你轻松创建 “脱离” 当前视图详细级别的计算字段。

或许你会疑惑,为什么不主动改变当前视图详细级别来实现同样的效果?比如新增或减少一个维度。

原因是,LOD 往往用于跨详细级别的计算,比如算部分相对总体的占比,计算当条记录是否为用户首单等等,更多的场景会在下次精读中解读。

讨论地址是:精读《什么是 LOD 表达式》· Issue #365 · dt-fe/weekly

如果你想参与讨论,请 点击这里,每周都有新的主题,周末或周一发布。前端精读 - 帮你筛选靠谱的内容。

关注 前端精读微信公众号

版权声明:自由转载-非商用-非衍生-保持署名(创意共享 3.0 许可证)

精读《什么是 LOD 表达式》相关推荐

  1. 【韩松】Deep Gradient Comression_一只神秘的大金毛_新浪博客

    <Deep Gradient Compression> 作者韩松,清华电子系本科,Stanford PhD,深鉴科技联合创始人.主要的研究方向是,神经网络模型压缩以及硬件架构加速. 论文链 ...

  2. 【韩松】Deep Gradient Comression

    <Deep Gradient Compression> 作者韩松,清华电子系本科,Stanford PhD,深鉴科技联合创始人.主要的研究方向是,神经网络模型压缩以及硬件架构加速. 论文链 ...

  3. [文献阅读] Sparsity in Deep Learning: Pruning and growth for efficient inference and training in NN

    文章目录 1. 前言 2. Overview of Sparsity in Deep Learning 2.1 Generalization 2.2 performance and model sto ...

  4. 【翻译】Batch Normalization: Accelerating Deep Network Trainingby Reducing Internal Covariate Shift

    Batch Normalization: Accelerating Deep Network Trainingby Reducing Internal Covariate Shift Sergey I ...

  5. 模型加速--CLIP-Q: Deep Network Compression Learning by In-Parallel Pruning-Quantization

    CLIP-Q: Deep Network Compression Learning by In-Parallel Pruning-Quantization CVPR2018 http://www.sf ...

  6. 论文笔记30 -- (视频压缩)【CVPR2021】FVC: A New Framework towards Deep Video Compression in Feature Space

    <FVC: A New Framework towards Deep Video Compression in Feature Space> CVPR 2021 的一篇Oral 提出了特征 ...

  7. 端到端图像压缩《Asymmetric Gained Deep Image Compression With Continuous Rate Adaptation》

    Asymmetric Gained Deep Image Compression With Continuous Rate Adaptation 一 简介 二 内容 2.1 目前方法的缺陷 2.2 整 ...

  8. 深度学习视频压缩1—DVC: An End-to-end Deep Video Compression Framework

    本文是第一篇端到端使用神经网络来进行视频压缩的论文, github地址:GitHub - GuoLusjtu/DVC: DVC: An End-to-end Deep Video Compressio ...

  9. 【论文阅读】Deep Compositional Captioning: Describing Novel Object Categories without Paired Training Data

    [论文阅读]Deep Compositional Captioning: Describing Novel Object Categories without Paired Training Data ...

  10. CVPR 2018 TRACA:《Context-aware Deep Feature Compression for High-speed Visual Tracking》论文笔记

    理解出错之处望不吝指正. 本文的模型叫做TRACA.模型中使用多个expert auto-encoder,在预训练阶段,每个expert auto-encoder针对一个特定类进行训练:在tracki ...

最新文章

  1. 自定义控件的构建(5)
  2. 使用WebUploader实现文件批量上传,进度条显示功能
  3. 向mysql 插入中文数值报错
  4. Java设计链表(不带头结点的单链表)
  5. 微软发布 .NET for Apache Spark 首个预览版
  6. 决赛来袭!十强战队齐聚,终极一战拉开帷幕!
  7. css3在线快速制作工具
  8. python中布尔变量的值为_python 布尔操作实现代码 python是如何定义并使用变量的...
  9. Java API For WebSocket(七)Java EE环境
  10. 张开涛 shiro 博客地址
  11. 转:Windows Azure Platform体验(3):Azure AppFabric
  12. 绘图用计算机软件的基本种类有,主编教您电脑绘图软件有哪些
  13. 6.29--6.30郭天祥老师课程中的一些错误与我的存疑
  14. 算法 c语言实现 英文版 pdf,数据结构与算法分析++C语言描述++英文版++..pdf-得力文库...
  15. Spark on Hive Hive on Spark傻傻分不清?
  16. mysql 慢日志可视化_Mysql 慢日志分析系统搭建 —— Box Anemometer
  17. 巴比特 | 元宇宙每日必读:未成年人打赏后要求退款,虚拟主播称自己是大冤种,怎么看待这个监管漏洞?...
  18. Windows——提高扩展显示屏的清晰度的一种方法
  19. python中time函数用法_python中time tzset()函数实例用法
  20. 脑机接口科普0009——侵入式与非侵入式的优缺点

热门文章

  1. Hadoop大数据平台搭建课程笔记
  2. MSYS2 环境搭建
  3. 熟悉的人不认识我了,不熟悉的人认识我了
  4. 中序线索二叉树的创建、线索化和遍历
  5. Qt编写自定义控件:唱片播放控件
  6. 常用的ddos防护方式
  7. python安装wheel,opencv与其它模块
  8. 连续系统的时域分析(一)LTI连续系统微分方程解法3——零状态响应的求解方法
  9. python实现生日悖论分析
  10. conda、anaconda、miniconda区别和miniconda安装