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