您的位置:首页 > 大数据 > 人工智能

saiku查询出错如何debug(saiku查询过程的本质),以及相关workbench的schema设置

2014-01-07 18:53 357 查看
saiku连接infiniDB数据库

1,日期维度无结果。

原因:(数据库表内容出错)

表最后一列(日期字段)匹配出错,用“like %日期%”可以。说明入库时写入多余的空白符,因为直接看不出。windows表数据,放到linux下,后面也是\a\0,要用dos2unix命令转换。

2,workbench :

(1)维度dimension设置:

事实表外键和维度表主键关联:从不同维度查询,实际就是两个表联合查询,本质是两个表做自然连接,因此事实表主键和维度表外键要一致,一一对应。如果类型不一致,报错:

SQLException: IDB-1002: 'factdownloadsnew' and 'dimstore' have incompatible column type specified for join condition.

错误设置为事实表外键用datevalue,维度表主键设为id。

(2)column设置:这是选择要查看什么内容(本质是 group by column的设定)看哪一列,比如月份,选month,则在主外键自然连接后,按month做group by,进行统计。

但saiku会自动加上该列的上一级列,进行操作,如month会自动加上year:

saiku自动生成的sql语句为:

SELECT

`dimDate`.`year` AS `c0`,

`dimDate`.`month` AS `c1`,

sum(

`factDownloadsNew`.`downloads`

)AS `m0`

FROM

`dimDate` AS `dimDate`,

`factDownloadsNew` AS `factDownloadsNew`

WHERE

`factDownloadsNew`.`date_time` = `dimDate`.`datevalue` // 自然连接要对应

GROUP BY

`dimDate`.`year`,

`dimDate`.`month`

group by也自动变成两列。

结果:



对比,将column设置为datevalue(原来是month):

SELECT

`dimDate`.`year` AS `c0`,

`dimDate`.`datevalue` AS `c1`,

sum(

`factDownloadsNew`.`downloads`

)AS `m0`

FROM

`dimDate` AS `dimDate`,

`factDownloadsNew` AS `factDownloadsNew`

WHERE

`factDownloadsNew`.`date_time` = `dimDate`.`datevalue`

GROUP BY

`dimDate`.`year`,

`dimDate`.`datevalue`



(3)namecolumn不设定,默认为用column。要显示的内容。

总结:

维度度主外键关联,实现自然连接;

column为查看内容,实现group by。自动加上一级。

用saiku查错:(saiku查询过程的本质)

mondrian_sql.log日志信息(tomcat/logs下)中,会给出组装的sql查询语句。sql里直接执行该sql查询语句,看结果,和执行过程。

从执行记录看,一个查询分4步,如

Month的downloads,组成sql为 :

1 select `dimDate`.`year` as `c0`, `dimDate`.`yearname` as `c1`, `dimDate`.`month` as `c2`, `dimDate`.`monthname` as `c3` from `dimDate` as `dimDate` group by `dimDate`.`year`, `dimDate`.`yearname`,
`dimDate`.`month`, `dimDate`.`monthname` order by ISNULL(`dimDate`.`year`) ASC, `dimDate`.`year` ASC, ISNULL(`dimDate`.`month`) ASC, `dimDate`.`month` ASC

统计年和月从dimdate,并分组。

2 select count(distinct `year`) from `dimDate`

3 select count(distinct `month`) from `dimDate`

年月个数

4 SELECT

`dimDate`.`year` AS `c0`,

`dimDate`.`month` AS `c1`,

sum(

`factDownloadsNew`.`downloads`

)AS `m0`

FROM

`dimDate` AS `dimDate`,

`factDownloadsNew` AS `factDownloadsNew`

WHERE

`factDownloadsNew`.`date_time` = `dimDate`.`datevalue`

GROUP BY

`dimDate`.`year`,

`dimDate`.`month`

核心,表连接查看。

负数问题:当反复几次计算后,会出现负数。如计算每天的下载量后,在看每年和每月的会出现负数现象。

.xml的schema文件设置中,cube属性中的cache被勾选(默认)。不勾选,无缓存,不出现负数。

cache是cube的事实表是否用modrian存储。用的话,会有逻辑上问题。。(后期详细排查)

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐