Spark SQL关联列谓词限制问题及交易日差计算方案求助
解决方案
Spark SQL 不支持在 SELECT 子句的关联子查询中引用外部查询的列作为 WHERE 条件的谓词,这是你遇到错误的原因。我们可以通过为交易日表生成连续索引,再与交易表关联的方式来解决这个问题:
实现代码
WITH numbered_trading_days AS ( SELECT trade_date, ROW_NUMBER() OVER (ORDER BY trade_date) AS day_index FROM trading_days ) SELECT t.id, t.start_date, t.transacted_date, CASE WHEN t.transacted_date IS NULL THEN NULL ELSE nt2.day_index - nt1.day_index END AS transact_in_days FROM trade_table t LEFT JOIN numbered_trading_days nt1 ON t.start_date = nt1.trade_date LEFT JOIN numbered_trading_days nt2 ON t.transacted_date = nt2.trade_date;
原理说明
- 为交易日生成索引:通过
ROW_NUMBER()函数按日期顺序给每个交易日分配一个连续的序号day_index。 - 关联交易表:将交易表分别与带索引的交易日表关联,获取
start_date和transacted_date对应的索引值。 - 计算交易日差:用结束日期的索引减去开始日期的索引,得到两个日期之间的实际交易日数量差,与你原查询中
count(1)-1的结果完全一致。
这种方式避免了关联子查询的限制,同时性能更优,适合处理大规模数据集。
内容的提问来源于stack exchange,提问作者Shubh
相关产品推荐
相关产品推荐

