相关疑难解决方法(0)

不在Presto vs Spark SQL的实现中

我得到了一个非常简单的查询,当在同一硬件上运行Spark SQL和Presto时(3小时vs 3分钟),显示出显着的性能差异。

SELECT field 
FROM test1 
WHERE field NOT IN (SELECT field FROM test2)
Run Code Online (Sandbox Code Playgroud)

经过对查询计划的研究,我发现原因是Spark SQL如何处理NOT IN谓词子查询。为了正确处理NOT IN的NULL,Spark SQL将NOT IN谓词转换为Left AntiJoin( (test1=test2) OR isNULL(test1=test2))

Spark SQL引入OR isNULL(test1=test2)了确保的正确语义NOT IN

但是,ORLeft AntiJoin连接谓词的唯一可行的物理连接策略Left AntiJoinBroadcastNestedLoopJoin。在当前阶段,我可以将NOT IN改写为NOT EXISTS来解决此问题。在NOT EXISTS的查询计划中,我可以看到join谓词是Left AntiJoin(test1=test2)为NOT EXISTS(5分钟完成)导致更好的物理联接运算符的原因。

到目前为止,我很幸运,因为我的数据集当前没有任何NULL属性,但是将来可能会具有,而NOT IN的语义正是我真正想要的。

所以我检查了Presto的查询计划,它没有真正提供,Left AntiJoinSemiJoin与一起使用FilterPredicate = not (expr)。Presto的查询计划没有提供太多信息,例如Spark。

所以我的问题更像是:

我可以假设Presto有更好的物理联接运算符来处理NOT IN操作吗?与Spark SQL不同,它不依赖于连接谓词的重写isnull(op1 = op2)来确保逻辑计划级别中NOT …

null isnull presto apache-spark-sql

5
推荐指数
1
解决办法
119
查看次数

标签 统计

apache-spark-sql ×1

isnull ×1

null ×1

presto ×1