CellSet cs = null;
try {
cs = getResultSet(query, connection);
} catch (OlapException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
PrintWriter pw = new PrintWriter(System.out);
//处理返回数据
if(cs.getAxes().size()>1){
for (Position row : cs.getAxes().get(1)) {
for (Position column : cs.getAxes().get(0)) {
for (Member member : row.getMembers()) {
System.out.println("rows:"+member.getUniqueName());
}
for (Member member : column.getMembers()) {
System.out.println("columns:"+member.getUniqueName());
}
final Cell cell = cs.getCell(column, row);
System.out.println("values:"+cell.getValue());
System.out.println();
}
}
}else{
for(Position column:cs.getAxes().get(0))
{
for(Member member:column.getMembers()){
System.out.println("columns:"+member.getUniqueName());
}
Cell cell=cs.getCell(column);
System.out.print("values:"+cell.getValue());
System.out.println();
}
}
}
public static void main(String[] args) {
Olap4jTest a = new Olap4jTest();
System.out.println("调用mondrian api进行查询");
a.testQuery();
}
}
执行的输出结果如下:
rows:[Time].[1997]
columns:[Measures].[Unit Sales]
values:74748.0
最后看一下使用的jar包的信息:
ok,测试完成了。虽然过程很曲折,但是也学到了一些新知识,这里只是对mondrian做了一个简单的demo,证明了通过api调用的方式使用olap4j可以使用后端的mysql进行olap操作,接下来还需要了解mondrian对于hive和sql on hbase的支持,今天又发现一个新的开源OLAP引擎:Kylin,这个是eBay开源的,它是一个MOLAP引擎,和mondrian(ROLAP引擎)不同的是它会在创建Cube的时候将需要展示的维度和度量聚合到一个表中,并且将这个表进行物化,保存在HBASE中,之后的查询操作不是通过MDX标准来完成的,而是对物化表的SQL查询,这样的优点就是查询速度非常快,但是物化的过程需要一定的时间,并且物化表并不一定能够完全支持所有的cude操作,如果不能支持的话还是通过ROLAP的方式到hive表中动态查找(类似于mondrian),而mondrian不需要保存任何数据(除了mondrian的元数据),所有的MDX查询操作都是动态的生成sql,交由后端的
数据库执行完成的,这些sql很可能是多表的join操作,对于hive而言可能性能上是一个很大的问题。 我觉得mondrian的学习主要在于两个方面:cude的定义和MDX查看,所以接下来还需要学习一个mondrian中生成cube的xml文件的格式,如何定义一个cube、MDX的语法等,先做一个后端连接hive的demo吧。
|