sybn sybn-util 项目说明文档 - 基于java的跨数据库联合查询

FillListUtil 数据对齐工具

2019-06-01
sybn

简介

处理数据时经常遇到不整齐的数据, 比如不同的行列数不一致, 本应递增的列表中间缺少部分行。

FillListUtil 专门负责补齐这种不规整的数据。

需求说明

  • 待对齐的数据
t type a b
2019-06-01 x 111 112
2019-06-01 y 121 122
2019-06-02 x 211  
2019-06-03 y 321 322
  • 对齐后的数据
t type a b
2019-06-01 x 111 112
2019-06-01 y 121 122
2019-06-02 x 211 0
2019-06-02 y 0 0
2019-06-03 x 0 0
2019-06-03 y 321 322

使用样例

  • 数据对齐函数 java
import cn.sybn.util.stat.fill.FillListUtil;

String testDataJson = "[{t:'2019-06-01',type:'x',a:111,b:112},{t:'2019-06-01',type:'y',a:121,b:122},{t:'2019-06-02',type:'x',a:111},{t:'2019-06-03',type:'y',a:321,b:322}]";
List<Map<String, Object>> maps = JsonTools.parseJsonToListMap(testDataJson);
logger.info("待对齐的数据:\r\n{}", ListLogUtil.conver(maps, 16));

// 语法: fill(维度, 维度范围, 度量, 默认值)
List<Map<String, Object>> fill = FillListUtil.fill(maps, "t('', 'yyyy-MM-dd', '2019-06-01~2019-06-03', '1DAY'),type", null, "a,b", 0);
logger.info("对齐后的数据:\r\n{}", ListLogUtil.conver(fill, 16));
  • 数据对齐函数 sql
-- 待对齐的数据
select * from [{t:'2019-06-01',type:'x',a:111,b:112},{t:'2019-06-01',type:'y',a:121,b:122},{t:'2019-06-02',type:'x',a:111},{t:'2019-06-03',type:'y',a:321,b:322}]

-- 对齐数据t列, 补全缺失的数据  语法: fill(维度, 度量, 默认值)
fill("t('', 'yyyy-MM-dd', '2019-06-01~2019-06-03', '1DAY'),type", "a,b", 0)

待对齐的数据:

t type a b
2019-06-01 x 111 112
2019-06-01 y 121 122
2019-06-02 x 111  
2019-06-03 y 321 322

对齐后的数据:

t |type|a |b
2019-06-01|x |111|112 2019-06-01|y |121|122 2019-06-02|x |111|0
2019-06-02|y |0 |0
2019-06-03|x |0 |0
2019-06-03|y |321|322 ```

字段归类说明

  • 我们将 t,type 等维度数据定义为 dimension。

对齐时,不同的 dimension 之间取笛卡尔积,穷举所有的组合,缺失的值会被填充。

从数据来看, t 的值域为 2019-06-01,2019-06-02,2019-06-03 type 的值域为 x,y 因此对齐后的数据应该为 3*2=6 行

  • 我们将 a,b 这种度量字段,定义为 measure。

对齐时,任意一行的任意一个此类值为空(value == null or ““)则填充 measureDefaultsValue 作为其值。

从数据来看, 一共有 2个a 和 3个b 需要被填充0

函数介绍

  • 数据对齐函数

格式:FillListUtil.fill(List<Map<String, Object» sourceData, String fillArgs, Map<String, String> fillMap, String measure, Object measureDefaultsValue);

例如:FillListUtil.fill(maps, “t(‘’, ‘yyyy-MM-dd’, ‘2019-06-01~2019-06-03’, ‘1DAY’),type”, null, “a,b”, 0);

sourceData 被补充的数据列表

fillArgs 数据对齐参数,待补充的key的及其配置的集合(fill和valueKey的总合应该恰好等于list中的map的size)

fillMap (可选)fillArgs的值域,填写此值可能提高性能.一般直接将request的paramMap传进来即可.

measure (可选)待补充的value的度量key,如果有多个值逗号隔开

measureDefaultsValue (可选)度量value被补充的默认值。(常用值: null, 0, ‘’, rand())

  • 数据对齐参数 dimensionConf

可以用逗号分开声明多个 dimension 的值域,每个 dimension 的值域由一个函数来描述,函数格式如下:

格式:dimension(paramKey, fillType, fillScope, keyInterval)

例如:id(id,int),field,t(t,yyyy-MM-dd, 2021-12-01~2021-12-31, WEEK)

dimension = sourceData中数据的一个dimension

paramKey = (可选) 如果fillScope为空, 则从 fillMap中获取param对应的值作为fillScope

fillType = (可选) sourceData中此key的补全方式 正在操作的字段类型(str=默认值,使用String格式 / null=以valueScope为准 / values=以已有数据为准忽略valueScope / int=以int格式valueScope为准 / yyyy-MM-dd=以date格式valueScope为准 / scope=以int / date格式valueScope为准)

fillScope = (可选) sourceData中此key的补全范围(常用格式: ‘1~10’, ‘2021-12-01~2021-12-31’, ‘甲,乙,丙,丁’)

keyInterval = (可选) 数据步长,一般是: 1, 1DAY, 1MONTH, 1YEAR 等值


Similar Posts

上一篇 HBaseDao 介绍

Comments

暂不开放评论! 可微信联系