避免spark sql查询的笛卡尔连接

8i9zcol2  于 2021-07-09  发布在  Spark
关注(0)|答案(2)|浏览(346)

我试图从两个temp表的总数计算processrate,但是我得到了一个错误“detected implicit cartesian product for internal join between logical plan”,我甚至没有执行连接。我确信这个错误可以通过以正确的格式重新构造查询来解决,我需要你的帮助。下面是问题,

spark.sql("""
CREATE OR REPLACE TEMPORARY VIEW final_processRate AS
SELECT
      ((a.total - b.total)/a.total))* 100 AS processRate
FROM
    (select count (*) as total from sales) a,
    (select count (*) as total from sales where status = 'PENDING') b
""")

我在尝试使用查看数据时出错,

spark.sql("select * from processRate limit 10").show(false)

您能帮助格式化上述查询以解决此问题并查看 final_processRate ?

wmtdaxz3

wmtdaxz31#

我会这样写:

select avg(case when status = 'PENDING' then 0.0 else 1 end)
from sales;

这将返回未挂起的行的比例。

inb24sb2

inb24sb22#

对此不需要子查询。只需使用条件聚合:

spark.sql("""
CREATE OR REPLACE TEMPORARY VIEW final_processRate AS
SELECT
    ((count(*) - count(case when status='PENDING' then 1 end)) / count(*)) * 100 AS processRate
FROM sales
""")

然后可以使用以下命令查询临时视图:

spark.sql("select * from final_processRate")

这应该给你一个单一的数字/百分比以上计算。

相关问题