9

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

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

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

在我看来,RelOptRule可能是一个不错的选择。不幸的是,当我创建 new 时RelOptRule,我无法轻松找到要删除节点的父节点。

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

谢谢。

4

2 回答 2

8

创造一个新RelOptRule的方式是要走的路。请注意,您不应该尝试直接删除规则内的任何节点。相反,您匹配包含要替换的节点的子树(例如, aFilter在 a 之上TableScan)。然后用下推过滤器的等效节点替换整个子树。

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

浏览 Cassandra、MongoDB 或 Elasticsearch 适配器的一些代码可能会有所帮助,因为它们更简单。我还建议将其带到邮件列表中,因为您可能会在那里获得更详细的建议。

于 2016-10-24T14:49:06.457 回答
5

我已经创建了一些RelOptRule来下推 Project/Filter/Aggregate RelNode 上 TableScan。也许对其他人有帮助。

RelOptRule用于定义一些规则来匹配整个 RelNode 中的子树。匹配时,调用该onMatch方法做某事。

在该onMatch方法中,我们可以新建一个RelNode,调用该transformTo方法替换匹配的子树。

例如:

Project
  |
Filter
  |
TableScan

PushDownFilter规则如下:

  public class PushDownFilter extends RelOptRule {

  public PushDownFilter(RelOptRuleOperand operand, String description) {
    super(operand, "Push_down_rule:" + description);
  }

  public static final PushDownFilter INSTANCE =
      new PushDownFilter(
          operand(
              Filter.class,
              operand(TableScan.class, none())),
          "filter_tableScan");

  @Override
  public void onMatch(RelOptRuleCall call) {
    LogicalFilter filter = (LogicalFilter) call.rels[0];
    TableScan tableScan = (TableScan) call.rels[1];
    // push down filter
    call.transformTo(tableScan);
  }
}

该规则将匹配Filter->TableScan子树,然后调用该onMatch方法。transformTo该方法只有tableScan. 结果被Filter->TableScan替换为TableScan,整个RelNode如下:

Project
  |
TableScan

注意新RelDataTypeRelNode的必须等于匹配的子树。</p>

Calcite 支持一些规则的使用,例如FilterJoinRuleFilterTableScanRule等等。

于 2016-11-25T08:00:56.947 回答