集成

Apache Calcite

qianmoQqianmoQ· 更新于 2026-10-01· 阅读 4 分钟· 0 次阅读

登录后可跨设备保存划线和私人笔记登录

Apache Calcite](https://calcite.apache.org/) 是业界标准的 SQL 解析器、校验器和 JDBC 驱动,几乎可以在任何数据源之前加上一层 SQL 前端。

PLC4X 与 Calcite 的集成正是这样一种数据源:它把 Event-Pump 配置中的标签批次转换为 SQL 表,从而可以通过 JDBC 使用普通 SQL 查询 PLC 数据。

该模块位于 plc4x-extras 仓库中:

    <dependency>
      <groupId>org.apache.plc4x</groupId>
      <artifactId>plc4j-apache-calcite</artifactId>
      <version>1.0.0</version>
    </dependency>

如何映射到 SQL

该集成通过一个普通的事件泵(Event-Pump)配置文件进行配置。

  • 文件中的每个批处理(batch)对应一个表,表名取自该批处理 id。
  • 该批处理的每个标签(tag)对应一个列,列名取自该标签。
  • 每个表前都会附加两列:timestamp(数值的读取时间)和 source(数值来源连接的 id)。

列的类型根据接收到的第一条记录推断,因此在事件泵返回该批处理的第一个响应之前,查询会一直处于阻塞状态。

配置模式

Calcite 通过 model.json 指向该集成,使用 Plc4xSchemaFactory:

{
  "version": "1.0",
  "defaultSchema": "PLC4X",
  "schemas": [
    {
      "name": "PLC4X",
      "type": "custom",
      "factory": "org.apache.plc4x.Plc4xSchemaFactory",
      "operand": {
        "config": "/path/to/event-pump.yml",
        "limit": 100
      }
    }
  ]
}

config

事件泵配置文件的路径。.json 和 .xml 文件分别以 JSON 和 XML 格式加载,其他任何文件则以 YAML 格式加载。

limit

表所保留的行数。正值会创建一个有界表,保留最后 limit 条记录——这是即席查询的常规选择。值为 0 或更小则会创建流式表,它永远不会终止,设计用于配合 Calcite 的流式 SQL 使用。

查询

模型就绪后,任何 JDBC 客户端都可以指向它:

Properties properties = new Properties();
properties.put("model", "/path/to/model.json");
try (Connection connection = DriverManager.getConnection("jdbc:calcite:", properties)) {
    ResultSet rs = connection.createStatement().executeQuery(
        "SELECT timestamp, temperature, pressure FROM boiler");
    while (rs.next()) {
        // ...
    }
}

评论

登录后参与评论

正在加载评论…