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

时间:2019-05-25 02:19:24

标签: apache-calcite sql-parser

在我的情况下,我正在通过单个sql从多个数据源(例如csv+mysql)中查询数据。如何使用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);

这就是我现在所拥有的,但是似乎我什么都不想要〜_〜|||

非常感谢。

1 个答案:

答案 0 :(得分:0)

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

如果要提取该信息,则必须使用RelVisitor,就像我在硕士论文中所做的那样。您可以找到代码here和相关问题here