簡體   English   中英

Impala查詢-優化查詢以獲取給定鍵的唯一性

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM