一、algo的定义:
1、Algo是内存数据库计算引擎,提供SQL计算功能,支持常用的SQL算法,遵循SQL92标准 ,是一个迭代计算框架
2、Algo的作用:数据库分库后,替代SQL功能 替代复杂SQL 替代临时表 报表框架
二、原理:
1、DataSet的定义:
DataSet是结果集:类似JDBC ResultSet 结果集转换器 迭代计算
接口类:kd.bos.algo.DataSet
两类接口: Transform,转换DataSet,生成新的DataSet Action,消费DataSet
2、DataSet转换方法:
①、将一个DataSet转换成另一个DataSet 转换接口,包括主要sql操作,如orderby,select,where,filter,group by,range,top,union等等 可执行sql语句,executeSql
示例:
Dataset dataset =null;
Dataset test =dataset.executesql( "select * from test" );
②、Action是消费DataSet,Action执行结果不是DataSet,Action执行后,DataSet自动关闭。
Action接口不多,比如count,cache
3、DataSet引用关系树
DataSet经过多次转换后,会形成一个引用关系树,如:
DataSet c = a.union(b);
DataSet e = c.select(new String[]{“fid”,”fname”});
DataSet f = c.join(d,xxx).finish(); 非叶子节点都是被引用的DataSet 每个DataSet节点都会消耗资源或者引用资源,close时会释放资源 DataSet.close时,会自动close引用节点 所以,所有叶子节点close,会自动close整棵树 叶子节点必须close
三、Algo API对象
接口/对象类 |
作用 |
说明/注意 |
kd.bos.algo.Algo |
创建DataSet getCacheDataSet(String cacheId) |
这个类是入口,给平台使用的,业务不要使用 |
kd.bos.algo.DataSet |
DataSet操作接口,包括转换,action,close等 |
|
Kd.bos.algo.RowMeta |
DataSet的元数据,类似jdbc ResultSetMetaData 由字段Field[]组成 |
|
Kd.bos.algo.Field |
字段 |
|
Kd.bos.algo.DataType |
数据类型,包括主要数据类型 |
|
Kd.bos.algo.Input |
数据源接口 |
|
Kd.bos.algo.Row |
行接口,行值访问器 |
Row是一个虚接口,访问器,不是Object[],所以业务代码不能把Row缓存起来 |
CachedDataSet |
DataSet.cache的结果对象 |
不是DataSet的子类 |
CacheHint |
Cache hint,指示 |
|
JoinDataSet |
DataSet.join的结果对象,也是Join构造器 |
不是DataSet的子类 |
HashJoinDataSet |
DataSet.hashJoin的结果对象,也是HashJoin构造器 |
不是DataSet的子类 |
GroupbyDataSet |
DataSet.groupBy的结果对象,也是groupBy构造器 |
不是DataSet的子类 |
HashTable |
DataSet.toHashTable的结果对象,是hashJoin的参数 |
|
JoinType |
Join类型枚举 |
|
JoinHint |
Join hint,指示 |
|
RowMetaFactory |
创建RowMeta |
给平台用的 |
1、获取元数据RowMeta,Field,DataType ,
DataType类型 行遍历器 ,Row接口 DataSet接口 Transform Action Close
RowMeta rowMeta = dataSet.getRowMeta();
Field field = rowMeta.getField(index);
2、行遍历器:类似ResultSet,提供遍历方法 得到遍历器:Iterator<Row> iterator();
语法糖:for(Row row:DataSet)遍历,隐含调用了iterator方法 每个DataSet只能显式得到一次遍历器 虽然被引用的DataSet内部可能会被遍历多次
3、Row接口:
public int size(); | public Boolean getBoolean(int index); |
public Object get(int index); | public Boolean getBoolean(String field); |
public Object get(String field); | public Double getDouble(int index); |
public String getString(int index); | public Double getDouble(String field); |
public String getString(String field); | public BigDecimal getBigDecimal(int index); |
public Integer getInteger(int index); | public BigDecimal getBigDecimal(String field); |
public Integer getInteger(String field); | public Date getDate(int index); |
public Long getLong(int index); | public Date getDate(String field); |
public Long getLong(String field); | public Timestamp getTimestamp(int index); |
public Timestamp getTimestamp(String field); |
4、DataType类型:DataType type = field.getDataType();
BooleanType |
|
StringType |
|
IntegerType |
|
LongType |
|
DoubleType |
从元数据ORM框架查出来的数据不会有Double |
BigDecimalType |
|
DateType |
|
TimestampType |
|
NullType |
Select中动态创建null Field生成 |
UnknownType |
表达式解析后无法确定的列,业务不会用到 |
5、创建DataSet
①、业务使用: QueryServiceHelper. queryDataSet(String algoKey, String entityName, String selectFields, QFilter[] filters,String orderBys) ORM.queryDataSet(String algoKey, String entityName, String selectFields, QFilter[] filters,String orderBys) DB.queryDataSet();
②、Algo原生: Algo algo = Algo.create(algoKey); public abstract DataSet createDataSet(Collection<Object[]> rowList, RowMeta rowMeta); public abstract DataSet createDataSet(Iterator<Object[]> iterator, RowMeta rowMeta); public abstract DataSet createDataSet(ResultSet rs); public abstract DataSet createDataSet(Input… inputs);
③、通过Input创建DataSet,请参考高级API
④、什么是algoKey
无论由哪种方法创建DataSet,都必须传algoKey algoKey是用来: 监控追踪DataSet的使用情况,包括日志,性能(IO,CPU,时间),执行计划 可根据algoKey动态配置DataSet执行行为 比如:algoKey=fi.abc,未来可能的配置项包括: algo.fi.abc.env=local/cluster/spark algo.fi.abc.maxrowcount=100000 algo.fi.abc.querytimeout=60*1000 algoKey定义规范: fi.gl.AccountBalance 调用类名字Class.getName()
⑤、DataSet 接口-sql查询
除了需要两个DataSet的操作,比如Join,Union,大部分都支持SQL查询 基于SQL查询得到DataSet和基于API得到DataSet是等价的
方法 |
功能 |
DataSet executeSql(String sql) |
执行sql语句 |
⑥、DataSet 接口:
DataSet接口,表达式语法在文档说明
方法 |
功能 |
select(String[] exprs) select(String exprs) |
选择字段,类似: select a,b,c,a,b,c可以是表达式 |
addField(String expr, String alias) |
增加字段 |
addNullField(String alias) |
增加null字段,等价于addField(“null”,alias) |
addBalanceField(String expr, String alias) |
增加余额字段,该字段的值从上往下累加 |
removeFields(String... fields) |
删除字段 |
filter(String expr) filter(String expr, Map<String, Object> params) where(String expr) where(String expr, Map<String, Object> params) |
过滤,类似where,expr中可以写变量,变量值通过params传递,比如”a>b”, params是map,key包含a和b |
orderBy(String[] fields) |
排序,field可以写成field asc,field desc |
groupBy(String[] groupFields) groupBy(String[] groupFields, boolean[] orderByDescs) |
groupBy操作,后续详细说明 |
DataSet join(DataSet rightDataSet) DataSet join(DataSet rightDataSet, JoinHint hint) DataSet join(DataSet rightDataSet, JoinType type) DataSet join(DataSet rightDataSet, JoinType type, JoinHint hint) DataSet leftJoin(DataSet rightDataSet, JoinHint hint) DataSet rightJoin(DataSet rightDataSet, JoinHint hint) DataSet fullJoin(DataSet rightDataSet, JoinHint hint) |
Join操作,后续详细说明 |
DataSet hashJoin(HashTable hashTable, String leftJoinKeyField, String[] DataSet hashTableSelectFields) DataSet hashJoin(HashTable hashTable, String leftJoinKeyField, String[] DataSet hashTableSelectFields, boolean includeNotExist) |
HashJoin操作,后续详细说明 |