我是新来的 Spark
. 我们使用sparksql进行查询 Hive
上的表 AWS EMR
.
我通过逐步构建几个临时视图来运行一个复杂的查询。
例如,第一个临时视图是通过在步骤1中连接两个表来创建的,然后在下一步中使用此临时视图作为源,依此类推,直到最后一步,最后一步的结果将持久化到磁盘。举例如下:
create temporary view test1 as
select a.cust_id, b.prod_nm
from a
inner join b
on a.id = b.id;
create temporary view test2 as
select t1.*, t2.*
from test1 t1
inner join c t2
on t1.cust_id = t2.cust_id;
请注意,第一步的结果视图(test1)在第二步中用作与另一个表的连接中的源 C
.
现在,由于 lazy
对spark的求值,即使在每一步都创建了temp视图,但直到最后一步才提取数据。因此,在实现复杂转换的查询中,我们经常遇到性能问题(例如,在多个表上连接)。
基本上我有两个问题:
如何估计这样一个临时视图的大小(在任何给定的步骤中),以便在下一步将此视图连接到另一个表/视图时可以在下一步中选择正确的连接策略
对于这样一个改善性能的框架,最佳实践是什么。
注:我们使用spark 2.4。我没有访问pyspark的权限,但只能访问sparksql(查询配置单元表)。
感谢您的帮助。谢谢。
1条答案
按热度按时间4jb9z9bj1#
无法确定创建的临时视图的大小。
当使用spark这样的分布式框架时,连接策略不应该基于数据的大小,而是基于数据/连接键如何分布在多个分区上。如果您多次使用同一个temp视图,最好缓存它,这样应用程序就不会每次都从hdfs/s3读取它。
要在sql中缓存的代码
CACHE TABLE cache_view AS SELECT * from table;