如何将方解石逻辑计划转换为另一个数据引擎的物理计划?
How to convert Calcite Logical plan to another data engine's physical plan?
我正在尝试使用 Calcite 为 Apache - IoTDB(时间序列数据库)设计关系 table 结构和标准 SQL 查询。现在我想知道如何轻松地将 Calcite 的逻辑计划转换为 IoTDB 自己的物理计划。
例如,我执行一个简单的查询:
SELECT deviceid, temperature FROM root_ln WHERE deviceid = 'd1'
经过Calcite解析后,RelNode
s表示的Logical Plan是这样的:
LogicalProject(DEVICEID=[], TEMPERATURE=[])
LogicalFilter(condition=[=(, 'd1')])
EnumerableTableScan(table=[[IoTDBSchema, ROOT_LN]])
并且我想将其转换为IoTDB自己的物理计划,我需要提供:(只是简单的例子)
- 项目的路径,如
root.ln.d1.temperature
,我们通过这些路径执行查询。我必须将 tablename(root.ln)
、deviceid(d1)
和 measurement(temperature)
放在一起才能得到完整的路径。这需要扫描整个逻辑计划。
- 项目的数据类型,如浮点数。我可以从路径中获取它,这很简单。
- Filter的表达式,我得把
LogicalFilter
的表达式再转换成IoTDB的表达式,包括解析本例中
的意思。
我认为这涉及太多工作。当查询变得更复杂时,转换也变得更困难。
所以我认为也许有更简单的方法来完成这项工作。
为特定数据源创建物理计划的标准方法是为该数据源创建适配器。这相当于编写可以将逻辑运算符转换为物理运算符的规则。这允许数据源指定它可以实现哪些逻辑运算符以及如何实现。
我正在尝试使用 Calcite 为 Apache - IoTDB(时间序列数据库)设计关系 table 结构和标准 SQL 查询。现在我想知道如何轻松地将 Calcite 的逻辑计划转换为 IoTDB 自己的物理计划。
例如,我执行一个简单的查询:
SELECT deviceid, temperature FROM root_ln WHERE deviceid = 'd1'
经过Calcite解析后,RelNode
s表示的Logical Plan是这样的:
LogicalProject(DEVICEID=[], TEMPERATURE=[])
LogicalFilter(condition=[=(, 'd1')])
EnumerableTableScan(table=[[IoTDBSchema, ROOT_LN]])
并且我想将其转换为IoTDB自己的物理计划,我需要提供:(只是简单的例子)
- 项目的路径,如
root.ln.d1.temperature
,我们通过这些路径执行查询。我必须将tablename(root.ln)
、deviceid(d1)
和measurement(temperature)
放在一起才能得到完整的路径。这需要扫描整个逻辑计划。 - 项目的数据类型,如浮点数。我可以从路径中获取它,这很简单。
- Filter的表达式,我得把
LogicalFilter
的表达式再转换成IoTDB的表达式,包括解析本例中的意思。
我认为这涉及太多工作。当查询变得更复杂时,转换也变得更困难。
所以我认为也许有更简单的方法来完成这项工作。
为特定数据源创建物理计划的标准方法是为该数据源创建适配器。这相当于编写可以将逻辑运算符转换为物理运算符的规则。这允许数据源指定它可以实现哪些逻辑运算符以及如何实现。