我在Apache Spark 2.x中有两个表。每个表都有一个公共行“ IDNUM”。称它们为表A和表B。
这在Apache SparkSQL中很快:
SELECT COUNT(*) FROM A where IDNUM IN (SELECT IDNUM FROM B);
这非常慢:
SELECT COUNT(*) FROM A where IDNUM NOT IN (SELECT IDNUM FROM B);
它是如此之慢,以至于只是为了完成而更快:
total = SELECT COUNT(*) FROM A;
quan = SELECT COUNT(*) FROM A where IDNUM IN (SELECT IDNUM FROM B);
print(total-quan)
但是我不知道为什么NOT IN
应该这么慢。
答案 0 :(得分:1)
我不了解Apache Spark,但据我看来,数据库可以通过IDNUM快速访问A和B中的行/项,因此如果数字相等,可以非常快速地处理检查相等性的子选择或联接满足条件“ IDNUM IN(SELECT IDNUM FROM B)”的元素的数量低。获取整个表的计数是一种常见的情况,因此将对其进行优化以使其更快。
'IDNUM NOT IN(从B选择IDNUM)'天真地需要扫描IDNUM列以查找A中的所有行,以确保它们不在B的集合中。因为您只在进行计数,所以不需要确实需要这些行中的IDNUM值,但是我想查询优化器不够聪明,无法将查询转换为两个计数之间的差。