首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >星星之火SQL:空表连接与大表慢速

星星之火SQL:空表连接与大表慢速
EN

Stack Overflow用户
提问于 2021-07-06 06:19:59
回答 1查看 308关注 0票数 0

我有两张桌子

  1. 事务表(按年划分)
  2. 元数据表(所有键都是唯一的,没有分区,30M记录)我的Spark是

从PARTITION_YEAR =2022的事务中选择*(结果:0记录)

很快就能得到结果

从元数据中选择* KEY = "A“(结果:1条记录)

2-3秒才能得到结果

最后

选择*从事务t左转连接元数据m ON t.key = m.key,其中t.PARTITION_YEAR = 2022;

相当慢(3分钟)

尽管

SELECT * FROM (SELECT * FROM事务,其中PARTITION_YEAR = 2022)在t.key =m.key上留下联接元数据m;

还得等(3分钟)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-06 07:56:26

从您的查询行为来看,我猜您的文件格式是parquet

代码语言:javascript
复制
SELECT * FROM Metadata WHERE KEY = "A" 

这就像一个过滤器操作,它支持下推过滤器,它不会扫描整个表,而是快速地查看感兴趣的列(键)的parquet元数据(范围),并计算出。

但是当您加入Spark时:它必须将整个元数据表引入内存,并且它必须根据您的联接条件扫描和洗牌数据。也就是说,连接不支持下推过滤器。

最后2个查询本质上是相同的。星星之火只会将2022个数据带入内存。即使您的分区可能是空的,也会加载30M条元数据记录。

如果要避免对空分区使用这种情况,则应检查分区是否为空,然后只触发

最便宜/最有效的检查方式:

代码语言:javascript
复制
val dfPartition = spark.sql("SELECT * FROM Transaction WHERE PARTITION_YEAR = 2022;")

if(!dfPartition.isEmpty()) // fastest. 
{
  //Fire your join query
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68265485

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档