如何解决在Spark SQL中优化Theta联接
我只有2个表,我需要从第一个表(大表10 M
行)中获取记录,该表的transaction date
是lesser than or equal to
的{{1}}第二张表(带有effective date
行的小表),然后下游查询将使用此结果集。
表交易:
1
表REF:
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
因此,按照逻辑,我应该返回前 3 行并丢弃最后一条记录,因为它比参考日期eff_dt |
30/07/2020 |
(在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
提示,该sql也要花很长时间才能完成。
那么,有没有比该方法更有效的更聪明的方法来实现相同的逻辑呢?换句话说,是否可以在此查询中优化Theta联接?
谢谢。
所以我写了这样的东西:
解决方法
从https://databricks.com/session/optimizing-apache-spark-sql-joins引荐
您可以在trans_dt上尝试“存储桶”(仅在“年/月”存储桶中)吗?并编写2个查询以完成相同的工作
- 第一个查询,trans_dt(年/月)
- 第二次查询,trans_dt(年/月)= eff_dt(年/月)和trans_dt(日)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。