[英]Impala query - optimize a query to get the uniques for given key
我正在尋找一種方法來計算具有特定pkey的唯一用戶的數量,以及沒有該pkey的唯一用戶的數量。
這是一個示例表:
userid | pkey | pvalue
------------------------------
U1 | x | vx
U1 | y | vy
U1 | z | vz
U2 | y | vy
U3 | z | vz
U4 | null | null
我得到了預期的結果,以得到擁有pkey ='y'的唯一用戶以及未使用此查詢但事實證明是昂貴的:
WITH all_rows AS
( SELECT userid,
IF( pkey='y', pval, 'none' ) AS val,
SUM( IF(pkey='y',1,0) ) AS has_key
FROM some_table
GROUP BY userid, val)
SELECT val,
count(distinct(userid)) uniqs
FROM all_rows
WHERE has_key=1
GROUP BY val
UNION ALL
SELECT 'no_key_set' val,
count(distinct(userid)) uniqs
FROM all_rows a1 LEFT ANTI JOIN
all_rows a2 on (a1.userid = a2.userid and a2.has_key=1)
GROUP BY val;
Results:
val | uniqs
--------------------
vy | 2
no_key_set | 2
我希望避免使用任何臨時表,因此可以實現任何更好的方法嗎?
謝謝!
通過使用EXPLAIN
,您可以觀察到大部分成本都花費在執行過多的GROUP BY
聚合上,而不是在原始查詢中使用子查詢。
這是一個簡單的實現
WITH t1 AS (
SELECT pkey, COUNT(*) AS cnt
FROM table
WHERE pkey IS NOT NULL
GROUP BY pkey
), t2 AS (
SELECT COUNT(DISTINCT userid) AS total_cnt
FROM table
)
SELECT
CONCAT('no_', pkey) AS pkey,
(total_cnt - cnt) AS cnt
FROM t1, t2
UNION ALL
SELECT * FROM t1
t1
獲取每個pkey的唯一用戶計數表
+------+-----+ | pkey | cnt | +------+-----+ | x | 1 | | z | 2 | | y | 2 | +------+-----+
t2
獲取唯一身份用戶總數
+-----------+ | total_cnt | +-----------+ | 4 | +-----------+
我們可以使用t2
的結果來獲取t1
的補碼表
+------+-----+ | pkey | cnt | +------+-----+ | no_x | 3 | | no_z | 2 | | no_y | 2 | +------+-----+
這兩個表的最終聯合給出了結果
+------+-----+ | pkey | cnt | +------+-----+ | no_x | 3 | | no_z | 2 | | no_y | 2 | | x | 1 | | z | 2 | | y | 2 | +------+-----+
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.