spark sql临时视图的最佳实践

2mbi3lxu  于 2021-06-24  发布在  Hive
关注(0)|答案(1)|浏览(628)

我是新来的 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(查询配置单元表)。
感谢您的帮助。谢谢。

4jb9z9bj

4jb9z9bj1#

无法确定创建的临时视图的大小。
当使用spark这样的分布式框架时,连接策略不应该基于数据的大小,而是基于数据/连接键如何分布在多个分区上。如果您多次使用同一个temp视图,最好缓存它,这样应用程序就不会每次都从hdfs/s3读取它。
要在sql中缓存的代码 CACHE TABLE cache_view AS SELECT * from table;

相关问题