收集重复复合键的sql查询

dz6r00yl  于 2021-07-14  发布在  Spark
关注(0)|答案(1)|浏览(277)

我在pyspark工作,使用了很多sparksql。我正在尝试编写一个查询,在表中查找重复的复合键。
我有一个工作查询,但有人告诉我这是一个非常低效的查询,我应该重写它。以下是工作查询:

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

这实际上是一个“检查”查询;我希望没有结果。如果 (key0, key1) 不是唯一的。如果发生这种情况,我想找出有多少个重复的,以及值是什么,以便调试。但是,除非发生这种情况,否则运行它只是浪费时间,因此理想情况下,它应该是一个高效的查询。
想象一下,我的Dataframe包含以下内容:

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)) 但这和使用 GROUP BY 我得到一个错误,我需要对它使用聚合函数 value (建议使用 FIRST() ).
我可以不收了 value 但我更喜欢收集它的查询。
有没有一种方法可以重写我的查询,使它仍然可以正常工作,但效率更高?另外,如果您能推荐一个关于如何度量查询效率和优化它的好资源,我将不胜感激。

31moq8wy

31moq8wy1#

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

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

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

相关问题