【问题标题】:SQL query in apache calcite and teradataapache calcite 和 teradata 中的 SQL 查询
【发布时间】:2018-07-05 22:56:34
【问题描述】:

需要有关 apache 方解石的建议。我们在 Teradata 上运行了一些 SQL 查询。现在我们想在 Hadoop/Spark 上运行这些 sql 查询(原样),也许使用 Apache calcite。

我们在 Spark SQL (2.6.3) 和 Apache calcite 中尝试了这些 SQL 查询(原样) - 但很少有查询不运行。问题是如果我们定义一个派生变量 (AS) 并尝试在同一级别的同一查询中使用它,它在 SparkSQL 和 calcite 中不起作用,但在 Teradata 中起作用。示例查询:

select EMPNO, sum(deptno) as sum_dept, 
   case when sum_dept > 10 then 1 else 0 end as tmp 
from emps 
group by EMPNO; => WORKS in Teradata

但同样的方法在 SparkSQL 和 Calcite 中不起作用。抛出以下错误:

执行 SQL 时出错 "select EMPNO, sum(deptno) as sum_dept,当 sum_dept > 10 然后 1 else 0 以 emps 中的 tmp 结束时的情况 按 EMPNO 分组”:从第 1 行第 50 列到第 1 行第 57 列:列 在任何表中都找不到“SUM_DEPT”(状态=,代码=0)

有人(SparkSQL/Calcite 专家)知道是否有办法让它在 sparkSQL 或 calcite 中工作?

【问题讨论】:

    标签: hadoop apache-spark teradata apache-calcite


    【解决方案1】:

    在标准 SQL 中,别名只能在 ORDER BY 子句中使用,但 Teradata 允许在任何地方使用。您必须将别名替换为原始计算:

    select EMPNO, sum(deptno) as sum_dept, 
       case when sum(deptno) > 10 then 1 else 0 end as tmp 
    from emps 
    group by EMPNO;
    

    【讨论】:

    • 谢谢dnoeth。是的,当然这是一种方法。在我们的例子中,别名是一个复杂的,通常包含多个 case 语句。所以想知道是否有简单的方法来做到这一点。我想你是说这是不可能的?
    • 标准 SQL 提出的常用方法是嵌套查询,即在派生表或公用表表达式中分配别名,然后在外层使用。
    • 您好,我正在寻找将 Teradata 查询转换为 Hive/SQL 查询的工具。我发现一个声称这样做的网站“sqlines.com/online”。但是对于上述查询,它没有正确转换它。我很想知道是否有人成功使用了任何此类工具。迫切需要这个。
    • @sunillp 你有没有成功找到这样的工具?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    • 2021-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多