简介

G2 2.x 基于 DataFrame ,内置了大量的统计函数,以一句话一张图表的目标来实现图形语法,但是用户的接受程度并不高,理解困难,有一些内置的逻辑。
G2 3.x 开始我们提供了外置的数据处理模块 DataSet ,以 View 为核心概念,提供数据的转换、统计、布局等功能,但是这种方案也并不完美,整个生命周期没用同 G2 打通,无法同 G2 的交互进行整合。
G2 4.0 我们开始探索交互语法,交互过程中最终的反馈往往反映到数据上,这对数据管理的要求更高,G2 4.x 的后面几个版本中我们会将多维分析作为一个重点来做,所以整个数据处理模块需要重新设计。

G2 数据处理的内容

由于 G2 是面向工程的,而非直接的分析产品,我们需要在工程上考虑整个数据的生命周期,我们的数据处理模块将提供以下功能:

  • 数据生命周期管理:数据加载、数据缓存、更新、视图
  • 数据加工:数据过滤、排序、转换、去重、补齐、行列转换、数据清洗
  • 数据聚合:汇总、封箱、回归、密度函数等
  • 多维数据分析:切片、drill down, roll up

除此之外,还有一些功能是同数据处理相关,但是并没有放入数据处理模块中,而是同 G2 做更紧密的集成:

  • 关系图布局、TreeMap 生成(布局放在那里呢?)
  • 文本防遮挡
  • 数据调整(stack, jitter, symetric 和 dodge)

    生命周期管理

    数据加载模块

    数据加载有很多成熟的库,我们不会独立实现。

    缓存

    数据加载后,会缓存在页面中,使用 key 同数据源进行关联

    视图

    同一个数据源会生成不同的视图,每个视图展示数据的不同信息,可以在视图上进行数据加工、数据聚合,可以基于视图生成新的视图。
    多视图也需要支持 join 功能。

    更新

    当数据源更新时,缓存需要更新,关联的视图需要同步更新

    数据加工

    数据加工根据数据字段的类型不同而适合的加工类型也不同

    数据过滤

    度量数据和维度数据的过滤方式有一些差异:

  • 度量数据的过滤方式有:大于、小于、等于、区间

  • 维度的过滤方式:等于、在集合内

    排序

    排序可以同时在度量和维度上进行

    转换

    一般是指度量数据和维度数据的转换,但是也可以是单个维度拆分成多个维度,例如时间拆分成年月日。

    去重

    在前端页面做去重的并不多,但是有些场景下(宽表存在数据冗余的情况下)根据指定的几个字段进行去重还是必要的,可以形成一个新的视图。

    补齐

    数据的补齐一般发生在某些维度组合的情况下数据有丢失的情况,为了图表显示的正常而补充 0,这种情况经常发生在层叠面积图的场景下,否则会出现显示的错误。

    行列转换

    数据处理模块是为 G2的显示做准备的,数据库表中存储的结构可能会与 G2 要求的结构不一致,这就需要进行行列转换。

    数据清洗

    数据字段为 null 或者不符合数据字段类型的情形,一般不在前端处理,但是显示前需要处理掉。

    数据聚合

  • 汇总,常见的 min, max, count, avg, percent 等

  • 封箱,对数据进行区间的划分,用于生成直方图、色块图
  • 回归,各种线性回归、非线性回归
  • 密度函数,密度函数、平面的热力图计算等

    多维数据分析

    多维数据一般用 cube 表示,数据类型一般分为 度量(连续数据)和 维度(分类数据),是 BI 系统中的数据组成方式。

    切片

    根据维度将数据分割成不同的切片,然后在每个切片上实现数据加工和数据聚合,数据切片也是 rollup 和 drill down 的依据。

    rollup

    rollup 的中文是”上卷“,上卷操作可以给用户更加上层的概念,可以降低需要显示的图形。在上卷过程中,会自动的将数据进行汇总计算,常见的有 count, sum, min, max 等,

  • 上卷操作可以直接基于缓存的明细数据直接计算,

  • 可以多级递归上卷,这需要多个维度(或者单个维度自动转换成多个维度)
  • 上卷可以是异步的,当明细数据时抽样数据时,上卷操作需要后台计算并返回

    drill down

    dirll down 的中文是 “下钻”,是上卷的反过程,通过查看明细的方式将汇总数据分解,一般有两种初始化方式:

  • 初始化时仅加载顶层的汇总数据,每次下钻都请求下一级数据

  • 初始化时加载明细数据,自动计算每一级的上卷数据进行缓存,每次下钻时仅取缓存的数据

对于多个维度的数据每一级对应一个维度,但是对于单个时间维度来说可以对时间进行分解:年月日时分秒 都可以分解成一个独立的维度。

设计和实现