2017-06-26 59 views
0

我有一張表,我試圖找出如何基於第二列中的值進行數據透視和求和。HIVE樞軸和總和

示例輸入:

|own|pet|qty| 
|---|---|---| 
|bob|dog| 2 | 
|bob|dog| 3 | 
|bob|dog| 1 | 
|bob|cat| 1 | 
|jon|dog| 1 | 
|jon|cat| 1 | 
|jon|cat| 1 | 
|jon|cow| 4 | 
|sam|dog| 3 | 
|sam|cow| 1 | 
|sam|cow| 2 | 

輸出示例:

|own|dog|cat|cow| 
|---|---|---|---| 
|bob| 6 | 1 | | 
|jon| 1 | 2 | 4 | 
|sam| 1 | | 3 | 
+0

請提供您已經嘗試了一些什麼代碼片段,這將是對他人有幫助的。請參閱https://stackoverflow.com/help/how-to-ask獲取有用的提示。 – Nehal

回答

0

使用casesum()

select own, sum(case when pet='dog' then qty end) as dog, 
      sum(case when pet='cat' then qty end) as cat, 
      sum(case when pet='cow' then qty end) as cow 
    from your_table 
group by own; 
+0

當值已知時,這很有效,但是您知道是否有辦法做到這一點,而無需指定每個字段?我正在使用這些數據的一些數據集是動態的。 – Jay

+1

在HiveQL中,您應該知道列。如果你需要動態SQL,然後使用shell/java/etc,選擇不同的查詢值,構建查詢並在Hive中執行 – leftjoin

1

對於動態數據,可以使用MAP

select  own 
      ,str_to_map(concat_ws(',',collect_list(concat(pet,':',cast(qty as string))))) as pet_qty 

from  (select  own,pet 
         ,sum(qty) qty 

      from  mytable 

      group by own,pet 
      ) t 

group by own 
; 

+-----+---------------------------------+ 
| own |    pet_qty    | 
+-----+---------------------------------+ 
| bob | {"cat":"1","dog":"6"}   | 
| jon | {"cat":"2","cow":"4","dog":"1"} | 
| sam | {"cow":"3","dog":"3"}   | 
+-----+---------------------------------+ 
+0

嗨,你看看這個建議嗎? –

+0

我喜歡你的解決方案。有沒有辦法讓它恢復inot列格式? – Duesentrieb

+0

如果你知道寵物的價值(貓,狗等)提前 –