乐趣区

关于压缩:多维分析后台实践-3维度排序压缩

【摘要】

用实例、分步骤,具体解说多维分析(OLAP)的实现。点击理解多维分析后盾实际 3:维度排序压缩

实际指标

本期指标,是在实现数据类型转化根底上,实现维度排序压缩,进一步晋升计算速度。

实际的步骤:

1、筹备根底宽表:批改上期的代码,实现维度排序压缩存成新组表。

2、拜访根底宽表:上期代码不用批改,间接利用于新组表。

3、新增数据追加:每日新增业务数据追加,每月从新排序重整。要尽可能不影响拜访根底宽表的性能,同时减小每日新增数据所须要的工夫。

本期样例宽表不变,仍然为 customer 表。从 Oracle 数据库中取出宽表数据的 SQL 语句是 select * from customer。执行后果如下图:

假如当天日期是 2021-01-12,则取出当日新增数据的 SQL 是:

select * from customer where begin_date=to_date(‘2021-01-12′,’yyyy-mm-dd’)

多维分析计算的指标也不变,用上面 Oracle 的 SQL 语句示意:

select department_id,job_id,to_char(begin_date,’yyyymm’) begin_month ,sum(balance) sum,count(customer_id) count

from customer

where department_id in (10,20,50,60,70,80)

and job_id in (‘AD_VP’,’FI_MGR’,’AC_MGR’,’SA_MAN’,’SA_REP’)

and begin_date>=to_date(‘2002-01-01′,’yyyy-mm-dd’)

and begin_date<=to_date(‘2020-12-31′,’yyyy-mm-dd’)

and flag1=’1′ and flag8=’1′

group by department_id,job_id,to_char(begin_date,’yyyymm’)

筹备宽表

维度排序压缩:有序列存。列存是指列式存储,集算器新建组表时,默认列存。

有序是指字段值物理有序存储,也就是用维度字段排序后存入组表。用于排序的维度字段程序十分要害,要将反复度高的维度排在后面。

本例的维度包含:department_id,job_num,employee_id,begin_date,customer_id。其中,部门编号 department_id 总数起码(事实表中只呈现 11 个部门),所以反复度最高。其余字段中,job_num,employee_id,begin_date,customer_id 反复度顺次升高。

同时,思考理论利用中,分组字段呈现的状况也和反复度基本一致,所以排序的字段程序能够确定为:department_id,job_num,employee_id,begin_date,customer_id。

咱们用数据库来做排序。示例如下:

select department_id,job_id,employee_id,begin_date,customer_id,first_name,last_name,phone_number,job_title,balance,department_name,flag1,flag2,flag3,flag4,flag5,flag6,flag7,flag8

from customer order by department_id,job_id,employee_id,begin_date,customer_id。

执行后果如图:

依据以上要求改写 etl.dfx,从数据库中取出排序数据,类型转化后,生成组表文件,存储根底宽表。代码示例如下:

其中:A2 的 SQL 语句减少了排序,A6 的组表指定了排序字段。

其余代码和上期统一。

数据量为一亿,导出组表文件和前几期的组表文件比拟如下:

从上表能够看出,实现数据类型优化之后,文件大小缩小了 14%(0.5GB)。再实现维度排序压缩后,又缩小了 20%(0.6GB), 总体缩小 31%(1.1GB)。文件变小,能缩小磁盘读取数据量,无效进步性能。

拜访宽表

拜访宽表的 SPL 代码、Java 代码和上期相比没有变动。

Java 代码加上后盾计算返回后果总的执行工夫,和后期比拟如下:

通过上表的比照能够看出,维度排序压缩进一步提高了计算性能。

新增数据

客户表每天都会有新增数据,须要每天定时增加到组表文件中。如果是按日期有序的组表文件,将每天产生的新数据追加到文件的最初即可。然而咱们的客户组表是依照部门等字段有序的,如果在结尾间接追加数据,就不是整体有序了。如果每天都将原有数据和新数据一起从新排序,计算的工夫会比拟长。

咱们能够从数据库中读取新数据并依照部门等字段排序,再用 T.append@a() 函数追加,集算器会主动新建一个补文件,每天新数据都有序归并到补文件中,补文件绝对较小,有序归并耗时较短。每月只需对客户表文件和补文件重整一次,将补文件有序归并到组表文件中。

采纳这个办法,编写 etlAppend.dfx,网格参数如下:

SPL 代码如下:

A1:判断输出日期是否是每月第一天,如果是,就执行 B1 对客户组表进行重整,将新数据造成的补文件有序归并进入客户组表文件。

A2:连贯 oracle 数据库。

A3:取出当天数据。

A4:取出 jobs 表数据,用于类型转换。

A5、B5、A6 与上期 etl.dfx 雷同。

A7:将明天新增数据有序归并到补文件中。

A8:敞开文件和数据库连贯。

etlAppend.dfx 须要每天定时执行。执行的办法是用 ETL 工具或者操作系统定时工作,通过命令行调用集算器脚本。

例如:

C:\Program Files\raqsoft\esProc\bin>esprocx d:\olap\etlAppend.dfx

退出移动版