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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
2023-02-22 使用tmpfs 进行nginx proxy_cache 加速
2023-02-22 nodejs error:03000086:digital envelope routines::initialization error 问题
2022-02-22 几款开源git server ssh 协议forced command 参考格式
2022-02-22 基于golang+openssh 服务实现一个简单的git over ssh 服务
2021-02-22 dremio sql server 查询中文的问题
2021-02-22 规避dremio数据查询限制的一些方法
2020-02-22 docker 几个不错的镜像加速地址