【问题标题】:Calcite parse sql into parts for mult data sourceCalcite 将 sql 解析为多数据源的部分
【发布时间】:2019-05-25 02:19:24
【问题描述】:

在我的情况下,我通过单个 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);

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

非常感谢。

【问题讨论】:

    标签: apache-calcite sql-parser


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢它的帮助。是否可以获得列的qualifiedName?对于 sql select name as username, s.salary as salary from emp e, salaries s,我从 RelNode 获得了文件名 username。如果我有一个合格的字段emp.name,这将有助于暗示它来自表emp
    • @itrrole 由于每个项目都必须与某种形式的 TableScan 相关联,即使在加入时,您也只需找到与您的项目相关联的正确表。查看上面发布的代码链接中的第 113 行。
    猜你喜欢
    • 1970-01-01
    • 2010-11-07
    • 1970-01-01
    • 1970-01-01
    • 2016-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多