kylin初识

1、数据仓库的相关概念

OLAP
大部分数据库系统的主要任务是执行联机事务处理和查询处理,这种处理被称为OLTP(Online Tra0nsaction Processing, OLTP),面向的是顾客,诸如:办事员、DBA等。而数据仓库主要面向知识工人(如经理、主管等)提供数据分析处理,这种处理被称为OLAP(Online Analysis Processing)。OLTP管理的是当前数据,比较琐碎,很难用于做决策。而OLAP管理的是大量历史数据,提供汇总与聚集机制,并在不同的维度、不同的粒度存储和管理信息。
Fact Table
事实表(Fact Table)是中心表,包含了大批数据并不冗余,其数据列可分为两类:
• 包含大量数据事实的列;
• 与维表(Dimension Table)的primary key相对应的foreign key。
Lookup Table
Lookup Table包含对事实表的某些列进行扩充说明的字段。在Kylin的quick start中给出sample cube(kylin_sales_cube)——其Fact Table为购买记录,lookup table有两个:用于对购买日期PART_DT、商品的LEAF_CATEG_ID与LSTG_SITE_ID字段进行扩展说明。

Dimension
维表(Dimension Table)是由fact table与lookup table逻辑抽象出来的表,包含了多个相关的列(即dimension),以提供对数据的多维观察;其中dimension的值的数目称为cardinatily。在kylin_sales_cube的事实表的LSTG_FORMAT_NAME被单独抽出来做一个dimension,可与其他维度组合分析数据。

星形模式(Star Schema)包含一个或多个事实表、一组维表,其中维表的primary key与事实表的foreign key相对应。这种模式很像星光四射,维表显示在围绕事实表的射线上。下图是我根据某数据源所建立的星形模式:
这里写图片描述

Cube
cube是所有的dimensions组合,任一dimensions的组合称为cuboid。因此,包含nn个dimensions的cube有2n2n个cuboid,如下图所示:
这里写图片描述

2. Kylin介绍

Dimension
为了减少cuboid的数目,Kylin将Dimension分为四种类型:
• Normal,为最常见的类型,与所有其他的dimension组合构成cuboid。
• Mandatory,在每一次查询中都会用到dimension,在下图中A为Mandatory dimension,则与B、C总共构成了4个 cuboid,相较于normal dimension的cuboid减少了一半。
这里写图片描述

•Hierarchy,为带层级的dimension,比如说:省份->城市, 年->季度->月->周->日;以用于做drill down。
这里写图片描述

• Derived,指该dimensions与维表的primary key是一一对应关系,可以更有效地减少cuboid数量,详细的解释参看这里;并且derived dimension只能由lookup table的列生成。
这里写图片描述

然而,Kylin的Hierarchy dimensions并没有做集合包含约束,比如:kylin_sales_cube定义Hierarchy dimension为META_CATEG_NAME->CATEG_LVL2_NAME->CATEG_LVL3_NAME,但是同一个CATEG_LVL2_NAME可以对应不同META_CATEG_NAME。因此,hierarchy 显得非常鸡肋,以至于在Kylin后台处理时被废弃了(详见Li Yang在mail group中所说):
@Julian, plan to refactor the underlying aggregation group in Q4. Will drop
hierarchy concept in the backend, however in the frontend for ease of
understanding, may still call it hierarchy.
Measure
Measure为事实表的列度量,Kylin提供诸如:
• Sum
• Count
• Max
• Min
• Average
• Distinct Count (based on HyperLogLog)
等函数,一般配合group by dimesion使用。
3. 实战
下面的SQL语句是在kylin_sales_cube build成功后执行的。
sql命令select * from kylin_sales,得到fact table所缓存的列——均为dimension的主key、measure中所需计算的字段。
各个时间段内的销售额及购买量:
select part_dt, sum(price) as total_selled, count(distinct seller_id) as sellers from kylin_sales group by part_dt order by part_dt
查询某一时间的销售额及购买量,
select part_dt, sum(price) as total_selled, count(distinct seller_id) as sellers from kylin_saleswhere part_dt = ‘2014-01-01’group by part_dt
发现报错:
Error while compiling generated Java code: public static class Record3_0 implements java.io.Serializable { public java.math.BigDecimal f0; public boolean f1; public org.apache.kylin.common.hll.HyperLogLogPlusCounter f2; public Record3_0(java.math.BigDecimal f0, boolean f1, …
这是因为part_dt是date类型,在解析string到date的时候出问题,应将sql语句改为:
select part_dt, sum(price) as total_selled, count(distinct seller_id) as sellers from kylin_saleswhere part_dt between ‘2014-01-01’ and ‘2014-01-01’group by part_dt – orselect part_dt, sum(price) as total_selled, count(distinct seller_id) as sellers from kylin_saleswhere part_dt = date ‘2014-01-01’group by part_dt
上面查询只用到了fact table,而没有用到lookup table。如果查询各个时间段所有二级商品类型的销售额,则需要fact table与lookup table做inner join:
select fact.part_dt, lookup.CATEG_LVL2_NAME, count(distinct seller_id) as sellersfrom kylin_sales factinner join KYLIN_CATEGORY_GROUPINGS lookup on fact.LEAF_CATEG_ID = lookup.LEAF_CATEG_ID and fact.LSTG_SITE_ID = lookup.SITE_IDgroup by fact.part_dt, lookup.CATEG_LVL2_NAMEorder by fact.part_dt desc

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值