我在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
但我更喜欢收集它的查询。
有没有一种方法可以重写我的查询,使它仍然可以正常工作,但效率更高?另外,如果您能推荐一个关于如何度量查询效率和优化它的好资源,我将不胜感激。
1条答案
按热度按时间31moq8wy1#
你的问题表面上很好。您可能会发现,简单的聚合速度更快:
这不会返回值,但会返回任何具有重复项的键。