我有一个暂时的看法,只有 1
记录/值,我想用这个值来计算另一个大表中客户的年龄(使用 100
m行)。我用了一个 CROSS JOIN
导致性能问题的。
有没有更好的方法来实现这一要求,哪一个会表现得更好?a会吗 broadcast
提示在这种情况下是否合适?处理这种情况的建议方法是什么?
参考表:(仅包含 1
值)
create temporary view ref
as
select to_date(refdt, 'dd-MM-yyyy') as refdt --returns only 1 value
from tableA
where logtype = 'A';
cust表格(10 m行):
custid | birthdt
A1234 | 20-03-1980
B3456 | 09-05-1985
C2356 | 15-12-1990
查询(计算年龄w.r.t birthdt
):
select
a.custid,
a.birthdt,
cast((datediff(b.ref_dt, a.birthdt)/365.25) as int) as age
from cust a
cross join ref b;
我的问题是-有没有更好的方法来实现这个要求?
谢谢
3条答案
按热度按时间gijlo24d1#
您正在使用的内部视图
constant
值,您可以简单地将相同的值放入下面的查询中,而无需交叉联接。nc1teljy2#
简单使用
withColumn
!ekqde3dh3#
很难准确地理解你的观点,但是如果你不能使用
Scala
或者pyspark
以及dataframes
与.cache
所以我认为temporary view
,只需创建一行table
. 我的印象是你在笔记本上使用spark%sql,比如说databricks。这是我的怀疑。
上面写着
broadcastjoin
提示很可能意味着优化器只发送1行。看到了吗https://jaceklaskowski.gitbooks.io/mastering-spark-sql/content/spark-sql-hint-framework.html#specifying-查询提示