我只有两个表,其中我需要从第一个表(大表)中获取记录 10 M
行)谁的 transaction date
是 lesser than or equal to
这个 effective date
在第二张table上(小table上有 1
行),然后下游查询将使用此结果集。
表事务处理:
tran_id | cust_id | tran_amt | tran_dt
1234 | XYZ | 12.55 | 10/01/2020
5678 | MNP | 25.99 | 25/02/2020
5561 | XYZ | 32.45 | 30/04/2020
9812 | STR | 10.32 | 15/08/2020
参考表:
eff_dt |
30/07/2020 |
因此,按照逻辑,我应该取回前3行并丢弃最后一条记录,因为它是 greater
超过参考日期(在 REF
表)
因此,我使用了 non-equi Cartesian Join
在这些表格之间:
select
/*+ MAPJOIN(b) */
a.tran_id,
a.cust_id,
a.tran_amt,
a.tran_dt
from transact a
inner join ref b
on a.tran_dt <= b.eff_dt
但是,由于 cross Join
与 transact
表偶数使用 Broadcast
提示。
那么,有没有更聪明的方法来实现比这更有效的相同逻辑呢?换句话说,有没有可能在这个查询中优化theta连接?
提前谢谢。
所以我写了这样的东西:
1条答案
按热度按时间643ylb081#
引用自https://databricks.com/session/optimizing-apache-spark-sql-joins
你能试着在trans\u dt上扣上扣子吗(只在年/月扣上扣子)。并编写两个查询来完成相同的工作
第一个查询,事务处理日期(年/月)<有效日期(年/月)。因此,这可以帮助您积极地挑选桶(而不是检查每一个记录交易日),这是少于2020/07。
第二个查询,事务处理日期(年/月)=有效事务处理日期(年/月)和事务处理日期(日)<=有效事务处理日期(日)