Apache Calcite 入门

Apahce Calcite 是一个动态的数据管理框架。它和经典的数据管理系统的主要区别在于它省略了经典数据管理系统的数据存储,数据加工,元数据存储等功能。
正是因为Calcite 有意的回避了这些功能,使得它成为了在应用和数据库之间的很好的一个中间适配软件。
如何引入calcite,以maven方式为例

<dependency>
       <groupId>org.apache.calcite</groupId>
       <artifactId>calcite-core</artifactId>
       <version>1.20.0</version>
</dependency>

下面来创建一个基于内存数据的查询

// 通过java创建一个具有类似表结构的数据
 public static class HrSchema {
     public final Employee[] emps = new Employee[2];
     public final Department[] depts = new Department[2];
 }
 public class Department {
    public Integer deptno;
    public Department(Integer deptno) {
        this.deptno = deptno;
    }
 }
public class Employee {
    public Integer empid;
    public Integer deptno;
    public Employee(Integer empid, Integer deptno) {
        this.empid = empid;
        this.deptno = deptno;
    }
}

接下来我们使用calcite 来查询这个结构里的数据

// 通过该方法来添加一些数据,并返回这个集合
  public static HrSchema createInmemSchema () {
        HrSchema hs = new HrSchema();
        hs.depts[0] = new Department(1);
        hs.depts[1] = new Department(2);
        hs.emps[0] = new Employee(11,2);
        hs.emps[1] = new Employee(22,2);
        return hs;
    }
// Class StudyDoc
   public static void TestInMemDatasource () throws ClassNotFoundException, SQLException {
        HrSchema hs = StudyDoc.createInmemSchema();
        Class.forName("org.apache.calcite.jdbc.Driver");
        Properties info = new Properties();
        info.setProperty("lex", "JAVA");
        Connection connection =
                DriverManager.getConnection("jdbc:calcite:", info);
        CalciteConnection calciteConnection =
                connection.unwrap(CalciteConnection.class);
        SchemaPlus rootSchema = calciteConnection.getRootSchema();
        Schema schema = new ReflectiveSchema(hs);
        rootSchema.add("hr", schema);
        Statement statement = calciteConnection.createStatement();
        ResultSet resultSet = statement.executeQuery(
                "select d.deptno, min(e.empid)\n"
                        + "from hr.emps as e\n"
                        + "join hr.depts as d\n"
                        + "  on e.deptno = d.deptno\n"
                        + "group by d.deptno\n"
                        + "having count(*) > 1");
        ShowQueryResult(resultSet);
        resultSet.close();
        statement.close();
        connection.close();
    }
// 查询的结果打印为:
deptno=2; EXPR$1=11

下面演示如何通过jdbc 来连接mysql数据源进行查询

public static void TestJDBCDatasource (String sql)  throws ClassNotFoundException, SQLException{
        if (sql == null) {
            sql = "select * from sap.sap_table limit 10";
        }
        Class.forName("org.apache.calcite.jdbc.Driver");
        Properties info = new Properties();
        info.setProperty("lex", "JAVA");
        Connection connection =
                DriverManager.getConnection("jdbc:calcite:", info);
        CalciteConnection calciteConnection =
                connection.unwrap(CalciteConnection.class);
        SchemaPlus rootSchema = calciteConnection.getRootSchema();
        Class.forName("com.mysql.jdbc.Driver");
        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setUrl("jdbc:mysql://localhost/sap");
        dataSource.setUsername("root");
        dataSource.setPassword("112233");
        Schema schema = JdbcSchema.create(rootSchema, "sap", dataSource,
                null, "sap");
        rootSchema.add("sap", schema);
        Statement statement = calciteConnection.createStatement();
        ResultSet resultSet = statement.executeQuery(
                sql);
        ShowQueryResult(resultSet);
        resultSet.close();
        statement.close();
        connection.close();
    }

注意:需要提前安装com.mysql.jdbc.Driver对应的jar包
Maven安装配置

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.41</version>
</dependency>

运行后的执行结果

ts_code=000001.SZ; symbol=000001; name=平安银行; area=深圳; industry=银行; list_date=19910403
ts_code=000002.SZ; symbol=000002; name=万科A; area=深圳; industry=全国地产; list_date=19910129
ts_code=000004.SZ; symbol=000004; name=国农科技; area=深圳; industry=生物制药; list_date=19910114
ts_code=000005.SZ; symbol=000005; name=世纪星源; area=深圳; industry=环境保护; list_date=19901210
ts_code=000006.SZ; symbol=000006; name=深振业A; area=深圳; industry=区域地产; list_date=19920427
ts_code=000007.SZ; symbol=000007; name=全新好; area=深圳; industry=酒店餐饮; list_date=19920413
ts_code=000008.SZ; symbol=000008; name=神州高铁; area=北京; industry=运输设备; list_date=19920507
ts_code=000009.SZ; symbol=000009; name=中国宝安; area=深圳; industry=综合类; list_date=19910625
ts_code=000010.SZ; symbol=000010; name=*ST美丽; area=深圳; industry=建筑施工; list_date=19951027
ts_code=000011.SZ; symbol=000011; name=深物业A; area=深圳; industry=区域地产; list_date=19920330

接下来演示如何通过配置json文件的方式来读取jdbc数据源的数据
上面的代码都是函数化的方式,不直观。看下面的配置,同样可以完成上面的功能设置:

//stock.json
{
  version: '1.0',
  defaultSchema: 'sap',
  schemas: [
    {
      name: 'sap',
      type: 'custom',
      factory: 'org.apache.calcite.adapter.jdbc.JdbcSchema$Factory',
      operand: {
        jdbcDriver: 'com.mysql.jdbc.Driver',
        jdbcUrl: 'jdbc:mysql://localhost:3306/sap',
        jdbcUser: 'root',
        jdbcPassword: '112233'
      }
    }
  ]
}
       public static void TestJDBCDatasourceByJsonCof() throws ClassNotFoundException, SQLException {
        Properties info = new Properties();
        info.setProperty("lex", "JAVA");
        Connection connection =
 // 读取上面的配置文件
                DriverManager.getConnection("jdbc:calcite:model=/Users/guosheng.lu/Desktop/Java/studyCalcite/src/main/java/stock.json", info);
        CalciteConnection calciteConnection =
                connection.unwrap(CalciteConnection.class);
        Statement statement = calciteConnection.createStatement();
        ResultSet resultSet = statement.executeQuery("select * from sap_table limit 10");
        ShowQueryResult(resultSet);
        resultSet.close();
        statement.close();
        connection.close();
    }

同样可以查询到如下结果。

通过上面的代码演示,我们可以初步感受到Apache Calcite 作为数据源和应用之间的中间件,是如何来配置并读取数据的。我们初步可以感受到,它作为一个中间件,可以适配多种具有一定数据结构的不管是内存中的还是我们传统的RDMS数据源。这对我们大数据数据仓库上对接多路数据的适配起到了很大的作用。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是学习 Apache Calcite 的一些步骤和资源: 1. 了解 Apache Calcite - 了解 Apache Calcite 的基本概念和特点。可以查看 Apache Calcite 官方网站和文档,了解 Calcite 的功能和用途。 2. 学习 SQL - Apache Calcite 是一个 SQL 解析器和查询优化器,因此了解 SQL 语言的基本语法和特性是非常重要的。可以阅读 SQL 教程或书籍来学习 SQL。 3. 安装和配置 Apache Calcite - 从 Apache Calcite 的官方网站下载最新版本的 Calcite,并按照官方文档的指导进行安装和配置。 4. 编写 SQL 查询 - 编写一些简单的 SQL 查询并在 Apache Calcite 中运行它们,可以使用 Calcite 的命令行界面,也可以在 Java 应用程序中集成 Calcite。 5. 学习 Apache Calcite 的 API - 学习 Apache Calcite 的 API,并尝试使用它们来开发自己的应用程序。可以查看官方文档和示例代码来学习 Calcite 的 API。 6. 参与社区 - 加入 Apache Calcite 的邮件列表和社区,与其他开发者交流,了解 Calcite 的最新动态和发展方向。 推荐一些 Apache Calcite 的学习资源: - Apache Calcite 官方网站:https://calcite.apache.org/ - Apache Calcite 官方文档:https://calcite.apache.org/docs/ - Apache Calcite 示例代码:https://github.com/apache/calcite/tree/master/example - Apache Calcite 的邮件列表:https://calcite.apache.org/mailing-lists.html - SQL 教程:https://www.w3schools.com/sql/ - 《Apache Calcite: A Foundational Framework for Optimized Query Processing》一书,由 Apache Calcite 的核心开发者编写,介绍了 Apache Calcite 的设计和实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

森哥的歌

一杯咖啡半包烟,助我熬过那长夜

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值