如何在Calcite中将项目,过滤,聚合下推到TableScan
我正在使用Apache
Calcite来实现分布式OLAP系统,该数据源是RDBMS。所以我想将RelNode
树中的项目/过滤器/聚合推到MyTableScan
extends
TableScan。在MyTableScan
,RelBuilder
得到推RelNode
。最后,RelBuilder
生成对源数据库的查询。同时,RelNode
应移动或修改原始树中的项目/过滤器/集合。
据我所知,方解石不支持此功能。
当前的局限性:JDBC适配器当前仅下推表扫描操作。所有其他处理(过滤,联接,聚合等)都在方解石内部进行。我们的目标是尽可能减少对源系统的处理,尽可能地翻译语法,数据类型和内置函数。如果Calcite查询基于单个JDBC数据库中的表,则原则上整个查询应转到该数据库。如果表来自多个JDBC来源,或者JDBC和非JDBC的混合,则Calcite将使用它可以使用的最高效的分布式查询方法。
我认为,这RelOptRule
可能是一个不错的选择。不幸的是,当我创建new时RelOptRule
,我不容易找到要删除的父节点。
RelOptRule
是个好选择吗?任何人都有实现此功能的好主意吗?
谢谢。
回答:
创建新产品RelOptRule
是必经之路。请注意,您不应该尝试直接删除规则内的任何节点。而是,您匹配一个包含要替换的节点的子树(例如,位于Filter
顶部的TableScan
)。然后,将整个子树替换为等效节点,从而将过滤器下推。
这通常通过创建相关操作的子类来处理,该子类符合特定适配器的调用约定。例如,在Cassandra适配器中,有一个CassandraFilterRule
与匹配LogicalFilter
的CassandraTableScan
。convert
然后,该函数构造一个CassandraFilter
实例。该CassandraFilter
实例设置了必要的信息,以便在实际发出查询时,过滤器可用。
浏览Cassandra,MongoDB或Elasticsearch适配器的某些代码可能会有所帮助,因为它们比较简单。我也建议将其添加到邮件列表中,因为您可能会在此处获得更详细的建议。
以上是 如何在Calcite中将项目,过滤,聚合下推到TableScan 的全部内容, 来源链接: utcz.com/qa/413989.html