方解石将 sql 解析为多个数据源的部分

Calcite parse sql into parts for mult data source

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

我要求的结果是这样的:
- TableA(col1, col2, col3) -> 数据源 CSV
- TableB(col1, colx, coly) -> 数据源 Mysql

我的情况类似于 Apache Drill(使用方解石)所做的事情,我尝试阅读 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);

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

非常感谢。

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

如果你想提取这些信息,你必须使用 RelVisitor 来完成,就像我在我的硕士论文中所做的那样。您可以找到代码 here and the related issue here