我有两张桌子
从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分钟)
发布于 2021-07-06 07:56:26
从您的查询行为来看,我猜您的文件格式是parquet。
SELECT * FROM Metadata WHERE KEY = "A" 这就像一个过滤器操作,它支持下推过滤器,它不会扫描整个表,而是快速地查看感兴趣的列(键)的parquet元数据(范围),并计算出。
但是当您加入Spark时:它必须将整个元数据表引入内存,并且它必须根据您的联接条件扫描和洗牌数据。也就是说,连接不支持下推过滤器。
最后2个查询本质上是相同的。星星之火只会将2022个数据带入内存。即使您的分区可能是空的,也会加载30M条元数据记录。
如果要避免对空分区使用这种情况,则应检查分区是否为空,然后只触发
最便宜/最有效的检查方式:
val dfPartition = spark.sql("SELECT * FROM Transaction WHERE PARTITION_YEAR = 2022;")
if(!dfPartition.isEmpty()) // fastest.
{
//Fire your join query
}https://stackoverflow.com/questions/68265485
复制相似问题