2016-10-10 27 views
1

我有一個數據蜂房表中以下格式移調數據

day  class start_time count kpi1 kpi2 kpi3 kpi4 ... kpi160 
----------------------------------------------------------------------- 
20161010 abc 00   12  1  0  null 0  ... 

我想寫一個蜂巢查詢中使用一些計算像maxmin獲取以下 格式的數據, avg

day  class start_time count kpi_name kpi_max kpi_min kpi_avg 
----------------------------------------------------------------------- 
20161010 abc 00   12  kpi1  max(kpi1) min(kpi1) avg(kpi1) 
20161010 abc 00   12  kpi2  max(kpi2) min(kpi2) avg(kpi2) 

請建議解決方案來獲取這種格式的數據。

謝謝。

回答

1

你需要把所有的kpi S IN的地圖,爆炸地圖創建一列,然後彙總。

實施例:

數據

+---------+------+-----------+-------+-----+-----+------+------+------+------+ 
|day_  |class |start_time |count_ |kpi0 |kpi1 | kpi2 | kpi3 | kpi4 | kpi5 | 
+---------+------+-----------+-------+-----+-----+------+------+------+------+ 
|20161010 |abc |00   |12  |1 |2 |3  |8  |9  |6  | 
+---------+------+-----------+-------+-----+-----+------+------+------+------+ 
|20161010 |abc |00   |12  |4 |5 |null |6  |10 |null | 
+---------+------+-----------+-------+-----+-----+------+------+------+------+ 

查詢

SELECT day_ 
    , class 
    , start_time 
    , count_ 
    , kpi_type 
    , MAX(vals) AS max_vals 
    , MIN(vals) AS min_vals 
    , AVG(vals) AS avg_vals 
FROM (
    SELECT day_, class, start_time, count_, kpi_type, vals 
    FROM database.table 
    LATERAL VIEW EXPLODE(MAP('kpi0', kpi0 
         , 'kpi1', kpi1 
         , 'kpi2', kpi2 
         , 'kpi3', kpi3 
         , 'kpi4', kpi4 
         , 'kpi5', kpi5)) et AS kpi_type, vals) x 
GROUP BY day_, class_, start_time, count_, kpi_type 

輸出

+---------+------+-----------+-------+---------+---------+---------+---------+ 
|day_  |class |start_time |count_ |kpi_type |max_vals |min_vals |avg_vals | 
+---------+------+-----------+-------+---------+---------+---------+---------+ 
|20161010 |abc |00   |12  |kpi0  |4  |1  |2.5  | 
+---------+------+-----------+-------+---------+---------+---------+---------+ 
|20161010 |abc |00   |12  |kpi1  |5  |2  |3.5  | 
+---------+------+-----------+-------+---------+---------+---------+---------+ 
|20161010 |abc |00   |12  |kpi2  |3  |3  |3.0  | 
+---------+------+-----------+-------+---------+---------+---------+---------+ 
|20161010 |abc |00   |12  |kpi3  |8  |6  |7.0  | 
+---------+------+-----------+-------+---------+---------+---------+---------+ 
|20161010 |abc |00   |12  |kpi4  |10  |9  |9.5  | 
+---------+------+-----------+-------+---------+---------+---------+---------+ 
|20161010 |abc |00   |12  |kpi5  |6  |6  |6.0  | 
+---------+------+-----------+-------+---------+---------+---------+---------+ 
+0

我以前的答案是不正確的。更新。 – gobrewers14

+0

謝謝!解決方案爲我工作:) –

0

如果您想獲得min,max,avg,您必須指定group By列,假設您想按天分組。

SELECT day, 
     class, 
     start_time, 
     count, 
     kpi1, 
     MAX(kpi1) as max_kpi1, 
     MIN(kpi1) as min_kpi1, 
     AVG(kpi1) as avg_kpi1 

FROM table 

GROUP BY day 
+0

感謝您的迴應!如果我將採用這種方法,那麼我將在單行中獲得12列。 但我想計算每個kpi在不同的行。 day,class,start_time,count,kpi_name,kpi_max,kpi_min,kpi_avg -------------------------------- -------------------------------------------------- - 20161010,ABC,00,12,kpi1,最大值(kpi1),分鐘(kpi1),AVG(kpi1) 20161010,ABC,00,12,kpi2,最大值(kpi2),分鐘(kpi2) ,平均(kpi2) –