6.17. 预计算
6.17.1. 建表语句
ldrill=' olap_name@combine1 olap_key@tx_year,tx_mon,tx_day olap_value@txnamt_combine_max,txnamt_combine_min,txnamt_combine_sum,txnamt_combine_count,age_combine_max,age_combine_min,age_combine_count '
- 注意事项:
txnamt_combine_max 分隔为 txnamt 与 max 求最大值,其他的 min,sum,count类似,目前不支持avg ,注意只支持小写
6.17.2. 倒排表里存储什么样(单个索引里面的预计算)
select tx_year,tx_mon,tx_day,txnamt_combine_max,txnamt_combine_min,txnamt_combine_sum,txnamt_combine_count,age_combine_max,age_combine_min,age_combine_count from trade_tbl
where partition like '202009' and syskv='ldrill.name:combine1' and syskv='ldrill.scan:1024000' limit 200
6.17.3. 二次汇聚得出最终结果
1. 按年月日
select tx_year,tx_mon,tx_day,count(*),max(txnamt_combine_max),min(txnamt_combine_min),sum(txnamt_combine_sum),sum(txnamt_combine_count),max(age_combine_max),min(age_combine_min),sum(age_combine_count) from trade_tbl
where partition like '202009' and syskv='ldrill.name:combine1' and syskv='ldrill.scan:1024000'
group by tx_year,tx_mon,tx_day
limit 200
2. 按年月
select tx_year,tx_mon,count(*),max(txnamt_combine_max),min(txnamt_combine_min),sum(txnamt_combine_sum),sum(txnamt_combine_count),max(age_combine_max),min(age_combine_min),sum(age_combine_count) from trade_tbl
where partition like '202009' and syskv='ldrill.name:combine1' and syskv='ldrill.scan:1024000'
group by tx_year,tx_mon
limit 200
注意事项:
and syskv='ldrill.scan:1024000' #是本次新增,用于动态调节ldrill的key扫描个数
6.17.4.预计算拦截功能
1.功能含义
含义:该功能的作用针对预计算中那些业务需要过滤的数据进行剔除功能,例如:无效数据或者偏差较大的年龄数据(年龄超过200岁或者为负值的数据,让其不参与预计算)。
2.自定义功能步骤
- add()方法,主要将数据从索引payload中读取出来,
- reset方法重制payload中读取的数据,
- combine()将结果转为二进制返回上层
- 实现类示例:
最后打成jar包放在lsql的lib目录下。
- 配置文件更改:
config/site/lsql-site.properties(配置文件):
添加配置项:
格式:cl.OlapCombine.customParams={‘combine_intercept_key’:’class path’}
示例:
cl.OlapCombine.customParams={‘intercept_int16’:’demo.LdrillCombineUdafCommonCustomP’}
其中:demo.LdrillCombineUdafCommonCustomP是示例类的全路径名
intercept_int16:combine拦截的自定义参数key,用于在建表语句中标示.
- 建表语句:
create table xxx (
tx_year y_string_is
,tx_mon y_string_is
,tx_day y_string_is
,txnamt y_long_is
,age y_int_is
)tableproperties(
ldrill=' olap_name@combine1 olap_key@tx_year,tx_mon,tx_day olap_value@txnamt_combine_max,txnamt_combine_min,txnamt_combine_sum,txnamt_combine_count combine_params@xxx1’
ldrill='olap_name@combine2 olap_key@age_combine_max,age_combine_min,
age_combine_count combine_params@xxx2’
)
注意: 那么对于多字段增加预计算过滤条件的方法有: 1.要么用户分别定义多个ldrill.name,每个ldrill.name只包含一种字段,查询时用union all连接; 2.用户定义一个ldrill.name,里面包含不同的字段,自定义类里面实现对不同字段的区分;
查询sql:
```sql select tx_year,tx_mon,tx_day,count(*),max(txnamt_combine_max),min(txnamt_combine_min),sum(txnamt_combine_sum),sum(txnamt_combine_count),max(age_combine_max),min(age_combine_min),sum(age_combine_count) from trade_tbl
where partition like '202009' and syskv='ldrill.name:combine1' and syskv='ldrill.scan:1024000'
group by tx_year,tx_mon,tx_day
limit 200
```
3.65535拦截示例
针对当前列大于65535数值的预计算过滤。
- 65535拦截建表配置示例:
create table xxx (
tx_year y_string_is
,tx_mon y_string_is
,tx_day y_string_is
,txnamt y_long_is
,age y_int_is
)tableproperties(
ldrill=' olap_name@combine1 olap_key@tx_year,tx_mon,tx_day olap_value@txnamt_combine_max,txnamt_combine_min,txnamt_combine_sum,txnamt_combine_count,age_combine_max,age_combine_min,age_combine_count combine_params@intercept_power16'
)
- 注意: intercept_power16内部已经实现,可以直接使用,拦截数值大于65535的数值
- 查询sql:
select tx_year,tx_mon,tx_day,count(*),max(txnamt_combine_max),min(txnamt_combine_min),sum(txnamt_combine_sum),sum(txnamt_combine_count),max(age_combine_max),min(age_combine_min),sum(age_combine_count) from trade_tbl
where partition like '202009' and syskv='ldrill.name:combine1' and syskv='ldrill.scan:1024000'
group by tx_year,tx_mon,tx_day
limit 200
- 作用:
执行上述2种方案的配置和建表操作后,入数据进行预计算时,会根据相应的k-v执行自定义预计算的实现类(LdrillCombineUdaf实现类),目前lsql内部额外定义一个类,主要用于过滤大于65535的数值;用户可以额外实现LdrillCombineUdaf接口,实现自定义过滤操作。