dremio SupportsExternalQuery 简单说明

dremio 的外部查询实际上就是让我们可以通过sql 直接查询source 而不是通过复杂的处理,可以解决一些sql 函数不能使用的问题
对于实现了SupportsExternalQuery 接口的存储扩展就可以实现此功能,比如jdbc 的(属于ce 扩展)

参考语法

SELECT * FROM table(my_oracle.external_query('select  * from app.demo'))

SupportsExternalQuery 包含的方法

如下图getExternalQueryFunction&isExternalQuery 属于静态方法,主要是一个帮助功能类,核心需要实现的是getExternalQueryPhysicalOperator

jdbc 的实现

反编译的代码

  • 参考代码
public PhysicalOperator getExternalQueryPhysicalOperator(PhysicalPlanCreator creator, ExternalQueryScanPrel prel, BatchSchema schema, String sql) {
      SchemaBuilder schemaBuilder = BatchSchema.newBuilder();
      com.google.common.collect.ImmutableSet.Builder<String> skippedColumnsBuilder = new com.google.common.collect.ImmutableSet.Builder();
      this.filterBatchSchema(schema, schemaBuilder, skippedColumnsBuilder);
      BatchSchema filteredSchema = schemaBuilder.build();
      ImmutableSet<String> skippedColumns = skippedColumnsBuilder.build();
      //  实际使用的JdbcGroupScan 这个物理操作器
      return new JdbcGroupScan(creator.props(prel, "$dremio$", schema, JdbcPrel.RESERVE, JdbcPrel.LIMIT), sql, (List)filteredSchema.getFields().stream().map((f) -> {
         return SchemaPath.getSimplePath(f.getName());
      }).collect(ImmutableList.toImmutableList()), this.getPluginId(), filteredSchema, skippedColumns);
}

dremio 内部处理

dremio 内部对于外部查询包含了自己的规则处理,包含了在逻辑计划, 以及物理计划中,还有元数据处理,当然反射的替换处理中也会使用到
这个和dremio 对于其他的处理规则类似,等后边详细介绍dremio 计划规则的时候介绍下,下边一些代码可以参考

参考资料

sabot/kernel/src/main/java/com/dremio/exec/store/SupportsExternalQuery.java
sabot/kernel/src/main/java/com/dremio/exec/tablefunctions/ExternalQueryScanPrel.java
sabot/kernel/src/main/java/com/dremio/exec/tablefunctions/ExternalQueryRelBase.java
services/jobs/src/main/java/com/dremio/service/jobs/metadata/QueryMetadata.java
sabot/kernel/src/main/java/com/dremio/exec/tablefunctions/ExternalQuery.java
sabot/kernel/src/main/java/com/dremio/exec/tablefunctions/ExternalQueryScanCrel.java
sabot/kernel/src/main/java/com/dremio/exec/tablefunctions/ExternalQueryScanDrel.java
sabot/kernel/src/main/java/com/dremio/exec/planner/acceleration/substitution/SubstitutionUtils.java
sabot/kernel/src/main/java/com/dremio/exec/tablefunctions/ExternalQueryTranslatableTable.java

posted on 2024-02-22 08:00  荣锋亮  阅读(7)  评论(0编辑  收藏  举报

导航