二、Calcite官方文档翻译--进阶

目录

二、进阶

2.1 适配器Adapters

2.1.1 Adapter

一个schema adapter允许Calcite去读取特定类型的数据,将这些data以一种table格式schema展示出来。

image2017-9-21 17:12:11.png

其他语言接口

image2017-9-21 17:12:35.png

2.1.2 Engines

 

许多工程和产品都是用Apache Calcite来做SQL解析,查询优化,数据可视化/合并,和物化视图重写。

https://calcite.apache.org/docs/powered_by.html

2.1.3 Drivers

 

Driver允许你在自己的应用中去连接Calcite

https://calcite.apache.org/apidocs/org/apache/calcite/jdbc/package-summary.html

JDBC driver是由Avatica来支持的。连接可以是本地的或是远程的(基于HTTP的JSON或是Protobuf)

JDBC连接的基础字符串格式如下

jdbc:calcite:property=value;property2=value2

其中的property和property2包含的具体参数如下描述。(连接字符串与OLE DB连接字符串语法兼容,由Avatica的ConnectStringParser支持。) 

2.1.4 JDBC连接参数

image2017-9-21 17:14:41.png

image2017-9-21 17:14:52.png

 

如果想要和一个基于内建的schema类型的单独schema进行连接,无需指定model。例如,

jdbc:calcite:schemaType=JDBC; schema.jdbcUser=SCOTT; schema.jdbcPassword=TIGER; schema.jdbcUrl=jdbc:hsqldb:res:foodmart

连接到这样的Cassandra adapter,相当于定义下面的model file ???   

image2017-9-21 17:15:22.png

2.2 流式数据查询

TODO

2.3 Lattices

 

Lattice是一个创建并填充物化视图的框架,它可以识别可以解决特定查询的物化视图。

一个Lattice代表一个星型(或雪花)模型,不是通用的schema。特别是,所有的连接关系必须是多对一,围绕星型模型的事实表建立。

Lattice的名字来源于数学: lattice是一个部分有序的集合,任何两个元素都有一个唯一的最大界和最小界。

[HRU96]  发现,多维数据集的可能物化集合构成一个lattice,并且使用一种算法来选择一组较为优化的物化组合。Calcite的推荐算法也是源于此。

Lattice使用SQL statement来代表星型模型,以此来进行定义。SQL是一种有用的能表示多个table join关系的短语,并且可以为列名指定别名(与发明一种新的语言来表示关系,join 条件和基数相比,SQL表达更为方便)。

和常规sql不同,顺序在这里很重要。如果你在from模块中将A放在B前面,并且实现一个A和B的join关系,可以说是从A到B有一个多对一的关系。(例如,在lattice例子中,Sales事实表在时间维表和产品维表之前先被触发,产品维表在产品分类维表之前被触发)

一个Lattice意味着一系列的约束。在A到B的关系中,在A到B的关系中,A表上存在一个外键(例如,每一个A表中的外键都会对应B表key中的一个值),和B表中的一个唯一key(例如,key值只会出现一次)。这些约束条件都非常重要,因为它允许执行计划器来移除没有用到的列的join关系,并且知道查询结果是不会变的。

Calcite不会去校验约束条件,如果违反规则,Calcite会直接返回错误结果。

Lattice是一个大的虚拟的join视图。它不是物化的(由于反规范化,它可能会比星型模型大好几倍),并且你可能并不想去对它进行查询(columns太多了)。

所以它到底是干什么的呢?

a. 如上面所说,lattice声明了许多有用的主键和外键约束。

b. 它帮助查询执行器将用户的查询行为映射到filter-join-aggregate 物化视图(针对dw查询最有用的物化视图类型)

c. 给Calcite一个框架来收集关于数据量和用户查询的统计信息

d. 允许Calcite去自动设计和填充物化视图

大多数星型模型会强制用户去定义一个column到底是维度还是指标。在lattice中,每一个column都是维度列(也就是说,它可以成为GROUP BY子句中的一列,用于在特定维度上查询星型模式)。所有的column也同样可以用作度量(指标),你可以为指定列指定聚合函数来定义一个度量(指标)。

如果“unit_sales”通常更倾向于作为度量使用而不是维度,也没有影响。Calcite算法在不久的将来会注意到它很少被聚合,就不会倾向于在它上面创建聚合层(当前算法在设计tiles(瓷砖???)时不会参考查询历史)。

但有人或许想知道,少于5的订单和多于100的订单利润是会更多还是更少。在这种场景下,“unit_sales”突然就成为一个维度了。如果声明一个列为维度列的成本为0,我想我们应该让所有的列都成为维度列。

该模型允许一个指定表以不同的表别名被多次使用。You could use this to model say OrderDate and ShipDate, with two uses to the Time dimension table.

大多数SQL系统要求一个视图的中的列名是唯一的,在lattice中比较难达到,因为经常会在一次join中同时包含主键和外键列。因此,Calcite允许用户通过两种方式引用列,如果列是唯一的,可以直接使用它的名字【‘unit_sales’】。不管列在lattice是否是唯一的,它在它的table中都是唯一的,因此你可以通过它的表表名来对它进行引用。如下例 

image2017-9-21 17:16:29.png

 

一个“tile”是lattice中的一个物化表,和一些特定的维度(在Kylin中被称为cuboid)。Lattice JSON 元素中的tiles属性定义了一个初始的物化tile集合。

如果你运行这个算法,你就能够省略tiles属性???。Calcite会选择一个初始集合。如果你定义了tiles属性,算法就会以定义的list开始运,然后开始寻找其他互补的tiles(eg fill in the gaps left by the initail tiles) 

 

 

展开阅读全文

没有更多推荐了,返回首页