sparksql中计算的交叉连接

k5hmc34c  于 2021-05-27  发布在  Spark
关注(0)|答案(3)|浏览(452)

我有一个暂时的看法,只有 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;

我的问题是-有没有更好的方法来实现这个要求?
谢谢

gijlo24d

gijlo24d1#

您正在使用的内部视图 constant 值,您可以简单地将相同的值放入下面的查询中,而无需交叉联接。

select 
a.custid, 
a.birthdt, 
cast((datediff(to_date('10-05-2020', 'dd-MM-yyyy'), a.birthdt)/365.25) as int) as age
from cust a;
scala> spark.sql("select * from cust").show(false)
+------+----------+
|custid|birthdt   |
+------+----------+
|A1234 |1980-03-20|
|B3456 |1985-05-09|
|C2356 |1990-12-15|
+------+----------+
scala> spark.sql("select a.custid, a.birthdt, cast((datediff(to_date('10-05-2020', 'dd-MM-yyyy'), a.birthdt)/365.25) as int) as age from cust a").show(false)
+------+----------+---+
|custid|birthdt   |age|
+------+----------+---+
|A1234 |1980-03-20|40 |
|B3456 |1985-05-09|35 |
|C2356 |1990-12-15|29 |
+------+----------+---+
nc1teljy

nc1teljy2#

简单使用 withColumn !

df.withColumn("new_col", lit("10-05-2020").cast("date"))
ekqde3dh

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-查询提示

相关问题