问题背景

Kylin作为一个极其优秀的MOLAP,提供了完整的Cube创建、更新流程。同时提供了Sql查询。功能上看没有问题,但是在提供查询服务的时候还是有些不友好。

sql查询需要常常需要关联Hive表,Cube的作用是对查询做优化,但是用户需要知道hive表结果——为什么不提供接口让用户直接对Cube模型查询呢?

比如,我们用kylin建立了一个Sales Cube,关于公司销售数据统计。维度包括:年/季度/天,以及部门site;统计值measure包括,销售金额,销量,销售员数量等。

这个Cube需要通过两个hive表join得到基础数据。

我们不想让用户关心底层的hive表结构,而是希望他们能够更直接地对Cube的数据结构查询。

MDX

多维表达式是OLAP的查询语言,查询对象是多维数据结构Cube,解析器(例如Mondrian)会吧MDX转换成SQL来查询关系数据库(可能是多条查询)。

Cubes Framework

从API调用者的角度提供一套OLAP操作的API可能更友好,例如我们的Sales Cube模型建立好之后,通过drilldown/rollup, slice/dice操作的组合就能得到最终的统计结果。这比用MDX或者Sql都更方便。Cubes能做到(https://pythonhosted.org/cubes/index.html)

某种意义上Cubes是多维模型的ORM。

Kylinpy

Cubes支持多种数据源,只要有SqlAlchemy dialect就可以。kylinpy是kylin的sqlalchemy包。但是跟cubes对接时需要稍作修改:

diff --git a/kylinpy/kylindb.py b/kylinpy/kylindb.py
index bd0562e..6d6f7c7 100644
--- a/kylinpy/kylindb.py +++ b/kylinpy/kylindb.py
@@ -39,6 +39,10 @@ class Cursor(object):
] for c in self._column_metas) def execute(self, query, *params, **kwargs):
+ for param in params:
+ for k,v in param.items():
+ query = query.replace('%('+k+')s', str(v))
+

Cubes model.json

根据Kylin的模型建立对应的Cubes模型文件:

{
    "dimensions": [
        {
            "name":"year",
            "levels": [
                {
                    "name":"YEAR",
                    "label":"YEAR",
                    "attributes": ["YEAR_BEG_DT"]
                },
                {
                    "name":"QUATER",
                    "label":"QUATER",
                    "attributes": ["QTR_BEG_DT"]
                },
                {
                    "name":"PART_DT",
                    "label":"PART_DT",
                    "attributes": ["PART_DT"]
                }
            ]
        },
        {
            "name":"site", 
            "levels": [
                {
                    "name": "LSTG_SITE_ID",
                    "label": "LSTG_SITE_ID",
                    "attributes": ["LSTG_SITE_ID"]
                }
         ]
        }
    ],
    "cubes": [
        {
            "name": "KYLIN_SALES",
            "dimensions": ["year", "site"],
            "joins": [
                 {"master":"PART_DT", "detail":"KYLIN_CAL_DT.CAL_DT","method": "match"}
            ],
            "measures": [
                {"name": "PRICE", "label": "PRICE"},
                {"name": "ITEM_COUNT", "label": "ITEM_COUNT"},
                {"name": "SELLER_ID", "label": "SELLER_ID", "aggregates":["count_distinct"]}
            ],
            "aggregates": [
                {
                    "name": "TOTAL_SOLD",
                    "function": "sum",
                    "measure": "PRICE"
                },
                {
                    "name": "TOTAL_ITEMS",
                    "function": "sum",
                    "measure": "ITEM_COUNT"
                },
                {
                    "name": "_COUNT_",
                    "function": "count"
                },
                {
                    "name": "DISTINC_SALLERS",
                    "function": "count_distinct",
                    "measure": "SELLER_ID"
                }
            ],
            "mappings": {
                    "year.PART_DT": "PART_DT",
                    "year.YEAR_BEG_DT": "KYLIN_CAL_DT.YEAR_BEG_DT",
                    "year.QTR_BEG_DT": "KYLIN_CAL_DT.QTR_BEG_DT",
                    "site.LSTG_SITE_ID": "LSTG_SITE_ID"                 },
            "info": {
                "min_date": "2010-01-01",
                "max_date": "2010-12-31"
            }
        }
    ]
}

slicer启动和使用

slicer.ini 文件

[workspace]
log_level: debug [server]
host: localhost
port: 5000
reload: yes
prettyprint: yes [store]
type: sql
url: kylin://ADMIN:KYLIN@localhost:7070/Tutorial?version=v1
schema=DEFAULT
dimension_schema=DEFAULT [models]
main: model.json

启动

slicer serve slicer.ini

http查询示例:

-- 按季度下钻所有统计结果

http://localhost:5000/cube/KYLIN_SALES/aggregate?drilldown=year:QUATER

-- 按年下钻所有统计结果

http://localhost:5000/cube/KYLIN_SALES/aggregate?drilldown=year:YEAR

-- 按年下钻site0的所有统计结果

http://localhost:5000/cube/KYLIN_SALES/aggregate?drilldown=year:YEAR&cut=site:0

-- 对0-4这几个销售点,统计2012年每个季度的结果

http://localhost:5000/cube/KYLIN_SALES/aggregate?drilldown=year.QUATER|site&cut=year.YEAR_BEG_DT:date'2012-01-01'|site:0-4

最新文章

  1. Effective java笔记(六),方法
  2. spring 事务:注解方式
  3. Web API应用架构在Winform混合框架中的应用(5)--系统级别字典和公司级别字典并存的处理方式
  4. HTML中head头结构
  5. JavaScript之数组循环 forEach 循环输出数组元素
  6. CentOS下挂在NTFS分区
  7. Android Handler之Message传递参数
  8. spark 1.3.0下的问题
  9. javascript debut trick, using the throw to make a interrupt(breakpoint) in your program
  10. [原]ubuntu下制作ubuntu源
  11. 关于highcharts(功能强大、开源、美观、图表丰富、兼容绝大多数浏览器的纯js图表库)
  12. []: secureCRT连接ubuntu问题- The remote system refused the connection
  13. jQuery内容过滤器
  14. keil4编译Error: User Command terminated, Exit-Code = 1解决
  15. vue/cli3 配置相对路径
  16. Yii2事件驱动的运行机制
  17. Python基础(4)列表、元组、字符串、字典、集合、文件操作
  18. 微信授权(Net Mvc)
  19. C#判断文件和文件夹是否存在 不存在则创建
  20. Hadoop生态圈-zookeeper的API用法详解

热门文章

  1. 保持ssh连接长时间不断开的技巧
  2. python大法好——递归、内置函数、函数进阶
  3. 源码阅读经验谈-slim,darknet,labelimg,caffe(1)
  4. mysql 使用注意
  5. tp5框架中jquery+ajax分页
  6. SQL 读取csv 文件批量插入数据
  7. Hibernate 再接触 总结
  8. apt与apt-get命令的区别与解释
  9. day39 mysql数据库基本操作
  10. python的基本用法(三)字符串常用函数