PySpark SQL 子查询不支持

Posted

技术标签:

【中文标题】PySpark SQL 子查询不支持【英文标题】:PySpark SQL subqueries not supporting 【发布时间】:2021-03-29 22:19:04 【问题描述】:

我正在尝试在 PySpark 中执行以下 SQL 语法。 该查询应该返回订阅的成功率(总订阅/total_entries)。 表名 = 银行 列名: “y”(购买的订阅)包含“yes”和“no”作为数据值。

查询已执行:

spark.sql(" select(x.total_subscribed / y.total_entries) as success_rate from (select count()as total_subscribed from banks_tbl where y ='yes')x, (select count() as total_entries from bank_tbl)y ").show()

我正在使用两个内部子查询:

下面的第一个内部查询返回购买订阅的客户总数:

(select count(*)as total_subscribed from banks_tbl where y ='yes')x)

第二个查询从表中返回客户总数:

(select count(*) as total_entries from banks_tbl)y ")

以及获取订阅率的外部查询: (购买订阅的客户总数/客户总数)

选择(x.total_subscribed / y.total_entries)作为成功率

但我收到如下错误:

"使用 CROSS JOIN 语法来允许这些关系之间的笛卡尔积\n,或者:启用隐式笛卡尔积 通过设置配置\n变量 spark.sql.crossJoin.enabled=true;'"

样本数据: +---+------------+--------+---------+--------+----- --+-------+----+-------+---+-----+--------+------- -+-----+--------+--------+---+ |年龄|工作|婚姻|教育|默认|余额|住房|贷款|联系|天|月|持续时间|活动|pdays|上一个|poutcome|y | +---+------------+--------+---------+--------+----- --+-------+----+-------+---+-----+--------+------- -+-----+--------+--------+---+ |58 |管理层 |已婚 |高等教育 |否 |2143 |是 |否 |未知|5 |可能 |261 |1 |-1 |0 |未知 |否 | |44 |技术员 |单身 |中学|否 |29 |是 |否 |未知|5 |可能 |151 |1 |-1 |0 |未知 |否 | |33 |企业家|已婚|中学|否|2 |是|是|未知|5 |可能|76 |1 |-1 |0 |未知|否| |47 |蓝领 |已婚 |未知 |否 |1506 |是 |否 |未知|5 |可能 |92 |1 |-1 |0 |未知 |否 | |33 |未知 |单个 |未知 |否 |1 |否 |否 |未知|5 |可能 |198 |1 |-1 |0 |未知 |否 | |35 |管理 |已婚 |高等教育 |否 |231 |是 |否 |未知|5 |可能 |139 |1 |-1 |0 |未知 |否 | |28 |管理 |单身 |三级 |否 |447 |是 |是 |未知|5 |可能 |217 |1 |-1 |0 |未知 |否 | |42 |企业家|离婚|高等教育 |是 |2 |是 |否 |未知|5 |可能 |380 |1 |-1 |0 |未知 |否 | |58 |退休 |已婚 |主要 |否 |121 |是 |否 |未知|5 |可能 |50 |1 |-1 |0 |未知 |否 | |43 |技术员 |单身 |中学|否 |593 |是 |否 |未知|5 |可能 |55 |1 |-1 |0 |未知 |否 | |41 |管理员。 |离婚|次要|否 |270 |是 |否 |未知|5 |可能 |222 |1 |-1 |0 |未知 |否 | |29 |管理员。 |单个 |次要|否 |390 |是 |否 |未知|5 |可能 |137 |1 |-1 |0 |未知 |否 | |53 |技术员 |已婚 |中学|否 |6 |是 |否 |未知|5 |可能 |517 |1 |-1 |0 |未知 |否 | |58 |技术员 |已婚 |未知 |否 |71 |是 |否 |未知|5 |可能 |71 |1 |-1 |0 |未知 |否 | |57 |服务 |已婚 |次要|否 |162 |是 |否 |未知|5 |可能 |174 |1 |-1 |0 |未知 |否 | +---+------------+--------+---------+--------+----- --+-------+----+-------+---+-----+--------+------- -+-----+--------+--------+---+

【问题讨论】:

请提供示例数据、期望的结果以及查询应该做什么的解释。 【参考方案1】:

我认为使用条件聚合更简单:

select avg(case when y = 'yes' then 1.0 else 0 end)
from banking_tbl;

【讨论】:

【参考方案2】:

实际上,您的查询格式不正确 spark.sql(''' select subscription_count/total_count as success_rate from (select (select count() from banks_tbl) as total_count,(select count() from banks_tbl where subscription='Y' ) as subscription_count )''')。显示() 它是如何执行的,请检查输出链接https://knowledges.co.in/q-a/

【讨论】:

以上是关于PySpark SQL 子查询不支持的主要内容,如果未能解决你的问题,请参考以下文章

SQL Presto:不支持相关子查询

SQL 查询错误(不支持具有跳过级相关性的相关子查询)

SQL 编译错误:无法在 Snowflake 中评估不受支持的子查询类型

SQL 编译错误:无法评估不受支持的子查询类型 - SELECT 子句中的函数调用

SQL 子查询

使用 case when 时出现 SQL (Redshift) 错误 - 不支持这种类型的相关子查询模式