美文网首页Sql引擎
Apache Calcite(一):初识

Apache Calcite(一):初识

作者: Cheemin | 来源:发表于2018-02-28 19:23 被阅读0次

    Apache Calcite(一):初识

    搬运翻译自Apache Calcite

    1.背景

    Calcite can handle any data source and data format.

    Apache Calcite是一个动态数据管理框架。它将数据存储和数据处理分离出去,专注于成为配置应用与一个或者多个数据存储位置以及数据处理引擎的中间件

    Calcite只需要输入数据即可。

    1.1 Calcite如何整理输入数据

    Calcite可以处理任何数据源和数据格式。要添加数据源,首先需要编写一个适配器adapter,告诉Calcite如何组织DataSource中的数据为“表”。

    • 首先创建schema

    • 直接读内存数据,在ReflectiveSchema.create注册一个对象作为schema

    • 使用JDBC时,有JdbcSchema.create

    • 之后按schema收集字段作为表

    1.2 Calcite提供的功能

    • 查询解析、验证、优化

    • 读取JSON格式

    • 许多标准和聚合函数

    • 针对LINQ4j前端和JDBC后端

    • SQL:

    • SELECT FROM(包括JOIN语法),WHERE,GROUP BY(包括GROUPING SETS),聚合函数(包括COUNT(DISTINCT ...)和FILTER),HAVING,ORDER BY(包括NULLS FIRST / LAST)UNION,INTERSECT,MINUS),子查询(包括相关的子查询),窗口集合,LIMIT(语法为Postgres)

    • 本地和远程JDBC驱动(Avatica)

    • 若干adapter

    2.体验

    以Calcite-example-CSV为例,完成以Calcite为中间件使用SQL读取CSV格式文本数据

    此CSV adapter可以作为其他数据格式adapter的模版

    此adapter中,能看出一个适配器应该:

    • 通过 SchemaFactory 和 Schema 接口 实现用户定义schema

    • schemas和views都以一个JSON模型文件中声明

    • 确定表的纪录类型

    • ScannableTable接口可以枚举所有行(Table的简单实现)

    • FilterableTable接口根据简单的谓词进行过滤

    • TranslatableTable接口使用planner rules转换相关操作(Table的高级实现)

    2.1 简单构建

    环境准备:JDK1.7以上,git,maven3.2.1以上

    $ git clone https://github.com/apache/calcite.git
    
    $ cd calcite
    
    $ mvn install -DskipTests -Dcheckstyle.skip=true
    
    $ cd example/csv
    

    连接到Calcite

    $ ./sqlline
    
    sqlline> !connect jdbc:calcite:model=target/test-classes/model.json admin admin
    

    ---------windows command 中运行的话为sqlline.bat

    执行元数据查询:

    sqlline> !tables
    
     +------------+--------------+-------------+---------------+----------+------+
    
    | TABLE_CAT  | TABLE_SCHEM  | TABLE_NAME  |  TABLE_TYPE   | REMARKS  | TYPE |
    
     +------------+--------------+-------------+---------------+----------+------+
    
    | null       | SALES        | DEPTS       | TABLE         | null     | null |
    
    | null       | SALES        | EMPS        | TABLE         | null     | null |
    
    | null       | SALES        | HOBBIES     | TABLE         | null     | null |
    
    | null       | metadata     | COLUMNS     | SYSTEM_TABLE  | null     | null |
    
    | null       | metadata     | TABLES      | SYSTEM_TABLE  | null     | null |
    
     +------------+--------------+-------------+---------------+----------+------+
    

    Tips:sqlline中!tables命令只是DatabaseMetaData.getTables()在后台执行 ,它还有其他命令来查询JDBC元数据,例如!columns!describe。)

    其他SQL操作,扫描、分组、内置函数

    sqlline> SELECT * FROM emps;
    
    ...
    
    sqlline> SELECT d.name, COUNT(*)
    
    . . . .> FROM emps AS e JOIN depts AS d ON e.deptno = d.deptno
    
    . . . .> GROUP BY d.name;
    
    ...
    
    sqlline> VALUES CHAR_LENGTH('Hello, ' || 'world!');
    

    2.2 Schema

    JDBC连接信息里给出schema的json文件路径,内容为:

    {
    
      version: '1.0',
    
      defaultSchema: 'SALES',
    
      schemas: [
    
        {
    
          name: 'SALES',
    
          type: 'custom',
    
          factory: 'org.apache.calcite.adapter.csv.CsvSchemaFactory',
    
          operand: {
    
            directory: 'target/test-classes/sales'
    
          }
    
        }
    
      ]
    
    }
    
    • name:模式名,对应数据库名

    • type:模式类型,custom为自定以

    • factory:指明适配器类

    • adapter类的create方法,传入参数,实例化一个schema

    • operand.directory:指明元数据路径

    模式的工作是扫描directory下满足要求后缀的的文件,以CsvSchema将数据解析为Table

    相关文章

      网友评论

        本文标题:Apache Calcite(一):初识

        本文链接:https://www.haomeiwen.com/subject/thbixftx.html