当前位置: 首页 > 面试题库 >

如何在Calcite中将项目,过滤,聚合下推到TableScan

昌正奇
2023-03-14
问题内容

我正在使用Apache
Calcite来实现分布式OLAP系统,该数据源是RDBMS。所以我想将RelNode树中的项目/过滤器/聚合推到MyTableScan extends TableScan。在MyTableScanRelBuilder得到推RelNode。最后,RelBuilder生成对源数据库的查询。同时,RelNode应移动或修改原始树中的项目/过滤器/集合。

据我所知,方解石不支持此功能。

当前的局限性:JDBC适配器当前仅下推表扫描操作。所有其他处理(过滤,联接,聚合等)都在方解石内部进行。我们的目标是尽可能减少对源系统的处理,尽可能地翻译语法,数据类型和内置函数。如果Calcite查询基于单个JDBC数据库中的表,则原则上整个查询应转到该数据库。如果表来自多个JDBC来源,或者JDBC和非JDBC的混合,则Calcite将使用它可以使用的最高效的分布式查询方法。

我认为,这RelOptRule可能是一个不错的选择。不幸的是,当我创建new时RelOptRule,我不容易找到要删除的父节点。

RelOptRule是个好选择吗?任何人都有实现此功能的好主意吗?

谢谢。


问题答案:

创建新产品RelOptRule是必经之路。请注意,您不应该尝试直接删除规则内的任何节点。而是,您匹配一个包含要替换的节点的子树(例如,位于Filter顶部的TableScan)。然后,将整个子树替换为等效节点,从而将过滤器下推。

这通常通过创建相关操作的子类来处理,该子类符合特定适配器的调用约定。例如,在Cassandra适配器中,有一个CassandraFilterRule与匹配LogicalFilterCassandraTableScanconvert然后,该函数构造一个CassandraFilter实例。该CassandraFilter实例设置了必要的信息,以便在实际发出查询时,过滤器可用。

浏览Cassandra,MongoDB或Elasticsearch适配器的某些代码可能会有所帮助,因为它们比较简单。我也建议将其添加到邮件列表中,因为您可能会在此处获得更详细的建议。



 类似资料:
  • 问题内容: 我要实现的目标:我不希望查询过滤器过滤“年龄”聚合,并且希望能够对其应用过滤器。 因此,如果我从以下查询开始: 我的聚合“ young_age”将同时被filter_1和filter_2过滤。我不希望我的汇总被filter_1过滤。 在查看文档时,我认为全局聚合可以解决我的问题,因此我编写了以下查询: 但是然后elasticsearch抱怨我的filter_2: “”“在[global

  • 问题内容: 我正在尝试过滤存储桶中的嵌套聚合。 对应: 索引数据: 我正在使用此查询和聚合定义 我从聚合结果中得到的是: 我在筛选存储桶列表时遇到了麻烦,因为它们只能提供所提供的事件ID,因此结果应类似于: 问题答案: 您快到了,只需要在聚合中添加过滤器即可,如下所示: 原因是您的查询将正确选择具有指定事件ID的嵌套事件的所有文档,但是,汇总将对所有选定文档中的所有嵌套事件进行处理。因此,您还需要

  • 我正在使用mongodb atlas,我已经建立了一个值。以下是用户收集的示例文档详细信息。 我试图显示除一个文档外的所有文档。 我已经显示了除测试之外的所有值_id:ObjectId(“5f7f193585d5f70c177f6d27”)在项目集合中。但我不能。 你能帮我解决这个问题吗。提前谢谢。

  • 问题内容: 我想按地址分组,然后按日期获取最新地址,然后按状态过滤此结果。 我在elasticsearch中有此查询,但它最多只能按地址分组并获取最新日期。我无法按状态过滤此结果。 我想使用Elasticsearch从该结果中获得出售状态 问题答案: 使用ES 使用ES可以做到这一点。首先,我们需要汇总地址。然后,我们使用两种汇总,一种汇总获取最新日期,另一种汇总获取销售状态的最新日期。然后,我们

  • 我必须滚动到recyclerview中的特定项目。 首先,我需要通过匹配从活动传递给适配器的字符串来获取项的位置。然后聚焦到该项目的位置。 例如,在适配器中有一个存储了EventID的TextView,我将把一个字符串从activity传递给适配器,使其与EventID匹配,然后获取该项目的位置,并将焦点/滚动设置到该特定位置。我在适配器中定义了一个方法来获取项的位置,但我不知道如何从活动中调用它

  • 我想使用箭头键关注下一个项。 在keydown事件处理程序中,我使用访问下一个项。 还有其他方法可以实现这一点吗? 在事件处理程序中,我想使用JQuery来实现这一点。这怎么做?