用于收集重复复合键的SQL查询

用于收集重复复合键的SQL查询,sql,apache-spark,query-optimization,Sql,Apache Spark,Query Optimization,我在PySpark工作,使用了很多Spark SQL。我试图编写一个查询,在表中查找重复的复合键 我有一个有效的查询,但有人告诉我这是一个非常低效的查询,我应该重写它。以下是工作查询: WITH cte AS ( SELECT key0, key1, value, COUNT(*) OVER (PARTITION BY key0, key1) AS dups_count FROM code_adm1 ) SELECT key0, key1, val

我在PySpark工作,使用了很多Spark SQL。我试图编写一个查询,在表中查找重复的复合键

我有一个有效的查询,但有人告诉我这是一个非常低效的查询,我应该重写它。以下是工作查询:

WITH cte AS (
    SELECT
        key0, key1, value,
        COUNT(*) OVER (PARTITION BY key0, key1) AS dups_count
    FROM code_adm1
)
SELECT key0, key1, value
FROM cte
WHERE dups_count > 1
ORDER BY key0 ASC, key1 ASC, value ASC
这实际上是一个“检查”查询;我希望没有结果。如果
(键0,键1)
的组合不唯一,则为错误。如果发生这种情况,我想找出有多少重复项,以及值是什么,以便进行调试。但除非发生这种情况,否则运行这种查询只会浪费时间,因此理想情况下,它应该是一种高效的查询

假设我的数据框包含以下内容:

key0   key1   value
=====================
able   baker  campground
alex   bean   car
alpha  bravo  charlie
alpha  bravo  cindy
axe    book   cop
我的正确查询输出:

alpha  bravo  charlie
alpha  bravo  cindy
有人告诉我,要获得重复复合键的计数,使用
count(DISTINCT(key0,key1))
效率要高得多,但这与使用
groupby
的效果相同,我得到一个错误,我需要在
值上使用聚合函数(Spark建议使用
FIRST()

我可以停止收集
,但我更喜欢收集值的查询


有没有一种方法可以重写我的查询,使它仍然可以正常工作,但效率更高?另外,如果您能推荐一个关于如何衡量查询效率并对其进行调优的好资源,我将不胜感激。

您的查询表面上很好。您可能会发现,简单的聚合速度更快:

SELECT key0, key1
FROM cte
GROUP BY key0, key1
HAVING COUNT(*) > 1;

这不会返回值,但会返回任何具有重复项的键。

关于查询效率,第一步通常是调查执行计划。然而,我并不认为这个目前正在工作的查询效率低到足以让人担心,这个查询实际需要多长时间?我主要是在实际数据集的小子集上进行测试。我不确定在完整的数据集上需要多长时间。我还没有关于子集需要多长时间的数字,但是如果你觉得它有用,我会得到这些数字。像“X行耗时Y秒”这样的东西有用吗?那就试试看执行计划吧,我并不擅长
apache spark
,但这似乎是一个没有任何连接的小查询,所以我真的认为如果索引工作正常,这个查询不会花很长时间。“X行耗时Y秒”不会提供足够的信息,首先尝试一下,如果速度太慢,请添加执行计划,这样我们就可以真正帮助调查性能问题。我已经在我自己的数据库(oracle)和索引上测试了您当前的查询,在300万行表上花费了6秒(这也会产生大量重复计数)。所以我认为你不必担心这个。