【问题标题】:How to convert Calcite Logical plan to another data engine's physical plan?如何将 Calcite 逻辑计划转换为另一个数据引擎的物理计划?
【发布时间】:2019-12-10 08:21:27
【问题描述】:

我正在尝试使用 Calcite 为 Apache - IoTDB(时间序列数据库)设计关系表结构和标准 SQL 查询。现在我想知道如何轻松地将 Calcite 的逻辑计划转换为 IoTDB 自己的物理计划。

例如,我执行一个简单的查询:

SELECT deviceid, temperature FROM root_ln WHERE deviceid = 'd1'

经过Calcite解析后,RelNodes代表的逻辑计划是这样的:

LogicalProject(DEVICEID=[$1], TEMPERATURE=[$2])
  LogicalFilter(condition=[=($1, 'd1')])
    EnumerableTableScan(table=[[IoTDBSchema, ROOT_LN]])

我想将其转换为 IoTDB 自己的物理计划,我需要提供:(只是简单的示例)

  1. 项目的路径,如root.ln.d1.temperature,我们通过这些路径执行查询。我必须将tablename(root.ln)deviceid(d1)measurement(temperature) 放在一起才能获得完整的路径。这需要扫描整个逻辑计划。
  2. 项目的数据类型,如浮点数。我可以从路径中得到它,很简单。
  3. Filter 的表达式,我必须将LogicalFilter 的表达式再次转换为IoTDB 的表达式,包括解析此示例中$1 的含义。

我认为这涉及太多工作。当查询变得更复杂时,转换也变得更加困难。

所以我认为也许有更简单的方法来完成这项工作。

【问题讨论】:

    标签: apache-calcite


    【解决方案1】:

    为特定数据源创建物理计划的标准方法是为该数据源创建适配器。这相当于编写可以将逻辑运算符转换为物理运算符的规则。这允许数据源指定它可以实现哪些逻辑运算符以及如何实现。

    【讨论】:

    • 感谢您的回复。我最近浏览了一些适配器的代码,比如 Cassandra、ElasticSearch Adapter。我有一些问题。以 Cassandra 为例,它创建了一些关系代数,如CassandraProjectCassandraFilter,并编写了一些响应规则将逻辑运算符转换为代表 Cassandra 特征的这些运算符。然后适配器通过附加转换结果来执行 CQL 查询,得到 Cassandra 需要的 CQL,对吧? (也许我理解错了。)
    • 如果我宁愿将 Calcite 生成的物理运算符直接转换为我们的物理计划而不是附加 SQL 并再次执行它,这可行吗?最后,我们直接从数据库而不是 Calcite 获取结果集。如果可行,我需要做的是创建像XXXFilter 这样的关系代数,携带我需要的信息,并编写规则将逻辑运算符转换为那个,对吧?
    • 您对适配器的工作方式是正确的。我不确定您将“直接转换为我们的物理计划而不是附加 SQL”是什么意思。一旦查询完成并构造了关系代数表达式,就不再涉及 SQL(当然,除非您最终对同样使用 SQL 的数据源执行查询。)
    猜你喜欢
    • 2018-01-21
    • 1970-01-01
    • 1970-01-01
    • 2018-05-31
    • 1970-01-01
    • 1970-01-01
    • 2019-05-01
    • 2018-03-06
    • 2023-03-18
    相关资源
    最近更新 更多