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 编译错误:无法在 Snowflake 中评估不受支持的子查询类型