首页 > 解决方案 > Calcite 将 sql 解析为多数据源的部分

问题描述

在我的情况下,我csv+mysql通过单个 sql 从多个数据源(如)查询数据。使用Calcite如何区分表的数据源并检测表上查询了哪些列?(数据源元数据可用)

我需要的结果类似于:
- TableA(col1, col2, col3) -> 数据源 CSV
- TableB(col1, colx, coly) -> 数据源 Mysql

我的情况类似于 Apache Drill(使用 Calcite)所做的事情,我尝试阅读 Drill 源代码,但我找不到 Drill 决定关系的方式。

String sql = "select c.c1, m.c2 from csv.tbl as c, mysql.schema.tbl as m where c.id = m.id”;

Frameworks.ConfigBuilder configBuilder = Frameworks.newConfigBuilder();
configBuilder.defaultSchema(`my SchemaPlus here`);
FrameworkConfig frameworkConfig = configBuilder.build();
Planner planner = Frameworks.getPlanner(frameworkConfig);

SqlNode sqlNode = planner.parse(sql);
planner.validate(sqlNode);
RelRoot relRoot = planner.rel(sqlNode);

这就是我现在所拥有的,但似乎没有我想要的东西~_~|||

非常感谢。

标签: apache-calcitesql-parser

解决方案


如果您的问题是如果您不将这些信息放入 SQL 查询中,Calcite 是否可以自动破译您正在使用的列,它不能。它将假定您使用的是默认架构并尝试将其映射到那里。如果您使用多个模式,那是愚蠢的(不是坏的方式),您必须告诉它该做什么。您必须编写 SQL 查询,以便它包含该信息,就像您所做的那样。

如果你想提取这些信息,你必须使用 RelVisitor 来完成,就像我在硕士论文中所做的那样。你可以在这里找到代码和相关问题在这里


推荐阅读