一周新的开始~
整理笔记~
To be more better~
正文
Aggregator组件,功能是起到聚合作用的一个组件。
这是一个很常用的组件,在日常会在这里经常用到诸如:SUM,AVG,MAX等聚合运算。
Mapping
源 -> SQ -> Aggregator -> Target
对于功能并不难理解,大致实现的功能可以用如下SQL来表述:
SELECT NAME,SUM(SALES)
FROM T_EMP
GROUP BY NAME
实现
实现Mapping,双击Aggregator组件,进入Edit Transformation界面。
在Ports选项界面,可以看到有个可以勾选GroupBy的地方,这边可以勾选你想要聚合的内容,例如上面的NAME。
建立一个数据端口SUM_SALES,设置其表达式为SUM(SALES)。
在Edit Transformation界面中的Aggregator Properties Tab界面中只需要关注一个Sorted Input。
当使用Sorted Input属性时,实现的功能逻辑类似于Joiner与Lookup,就是在Aggregator前面加了一个Sorter的组件。
这保证了Aggregator中的数据是有序的。
使用了Sorted Input属性,实现的Mapping类似于:
源 -> SQ -> SORTER -> AGGREGATOR -> TARGET
在Sorter组件中,选择的排序列必须与Aggregator中的GroupBy列一致或者包含,并在Aggregator组件的Properties Tab中选中Sorted Input属性。在Aggregator中使用Sorted Input会提升性能,但是也会消耗一定的资源。
条件聚合
Aggregator组件中与SQL中的SUM...GROUP BY有区别的。
Aggregator可以实现根据指定的条件下进行的汇总。
类似表达式可以表述为:SUM(SAL,SAL > 900)
使用Aggregator组件来进行行列转换
场景:一家企业,薪资组成包括基本工资,绩效工资,津贴,岗位工资4个类型。
应用系统DBA:
CREATE TABLE T_SAL
(
EMPNO NUMBER(4),
INCOME_TYPE NUMBER(4),
INCOME_AMOUNT NUMBER(7,2)
)
数据仓库DBA:
CREATE TABLE T_SAL_DW
(
EMPNO NUMBER(4),
BASE_SAL NUMBER(7,2),
PERFORMANCE_SAL NUMBER(7,2),
LEVEL_SAL NUMBER(7,2),
OTHER_SAL NUMBER(7,2)
)
设计编码表:
11 : 基本工资
22 : 绩效工资
33 : 岗位工资
44 : 津贴
设计的Mapping跟常规的一致:
源 -> SQ -> AGGREGATOR -> TARGET
区别在于,双击Aggregator组件,打开Ports Tab,在GroupBy字段,选择EMPNO。
工资的4个字段分别使用了如下表达式:
BASE_SAL SUM(INCOME_AMOUNT,INCOME_TYPE = 11)
PERFORMANCE_SAL SUM(INCOME_AMOUNT,INCOME_TYPE = 22)
LEVEL_SAL SUM(INCOME_AMOUNT,INCOME_TYPE = 33)
OTHER_SAL SUM(INCOME_AMOUNT,INCOME_TYPE = 44)
结果可以直接通过SQL语句查看即可:
SELECT * FROM T_SAL_DW
这是一个简单运用Aggregator组件行列转换的例子。