【问题标题】:How to convert teradata recursive query to spark sql如何将 teradata 递归查询转换为 spark sql
【发布时间】:2019-06-08 22:44:06
【问题描述】:

我正在尝试将以下 Teradata SQL 转换为 Spark SQL,但无法转换。有人可以提出解决方案吗?

create multiset table test1 as 
(
   WITH RECURSIVE test1 (col1, col2, col3) AS 
   (
      sel col11, col2, col3 
   from
      test2 root 
   where
      col3 = 1 
   UNION ALL
   SELECT
      indirect.col11,
      indirect.col2 || ',' || direct.col2 as col2,
      indirect.col3 
   FROM
      test1 direct,
      test2 indirect 
   WHERE
      direct.col1 = indirect.col11 
      and direct.col3 + 1 = indirect.col3 
   )
   sel col1 as col11,
   col2 
from
   test1 QUALIFY ROW_NUMBER() OVER(PARTITION BY col1 
ORDER BY
   col3 DESC) = 1 
)
with data primary index (col11) ;

谢谢。

【问题讨论】:

    标签: apache-spark apache-spark-sql teradata


    【解决方案1】:

    前段时间,我自己尝试了http://sqlandhadoop.com/how-to-implement-recursive-queries-in-spark/ 此处所述的方法。

    我找不到我的简化版本,但这种方法是目前唯一的方法。我假设将来会为此添加 Spark SQL 支持 - 虽然???

    进一步说明:我已经看到自己需要沿着这种 while 循环方法开发 KPI。我建议不要将用于 KPI 生成的递归 SQL 和 while 循环视为 Spark 的用例,因此应在完全符合 ANSI 的数据库中完成,并将结果存入 Hadoop(如果需要)。

    【讨论】:

    • 是的,我看到它可以使用 scala 来完成。但是有没有办法使用 spark sql 呢?比如解决方法什么的。
    • 没有。这就是重点。 Spark SQL 中的 WITH 语句目前是有限的。不需要递归,因此不需要程序化方法。
    • 我相信我已经回答了这个问题。
    • 能够解决它。我创建了一个如下视图:创建或替换临时视图 temp as select col11, col2, idx from test2 root where col3 = 1 ;创建或替换临时视图 finalTable as select col1 ,concat_ws(',', collect_list(col2)) tools_list from (select col1, col2 from temp order by col1, col2) as a group by col1;
    • 我怀疑像 Oracle 中的 connect by 这样的递归查询会被如此简单地解决。不是很相信。发布为您自己的答案。
    猜你喜欢
    • 2021-01-15
    • 2018-10-28
    • 1970-01-01
    • 2020-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-31
    • 2016-11-20
    相关资源
    最近更新 更多