2016-07-22 42 views
1

可以說我有一個計算列: -如何避免評估在蜂巢查詢相同的計算列repetedly

select str_to_map("k1:1,k2:2,k3:3")["k1"] as col1, 
     str_to_map("k1:1,k2:2,k3:3")["k2"] as col2, 
     str_to_map("k1:1,k2:2,k3:3")["k3"] as col3; 

如何「修復」列僅計算一次,並訪問其值中多次查詢?正在計算的地圖是相同的,只有不同的列訪問不同的鍵。反覆執行相同的計算是浪費資源。這個例子故意做得過於簡單,但重點是我想知道如何避免Hive中的這種冗餘。

回答

0

通常使用子查詢,它們被計算一次。

select map_col.["k1"] as col1, 
     map_col.["k2"] as col2, 
     map_col.["k3"] as col3 
from 
(
select str_to_map("k1:1,k2:2,k3:3") as map_col from table... 
)s; 

此外,您還可以將某些查詢實現爲表,以在不同的查詢或工作流中重用數據集。

+0

這將是微不足道的場景。對我來說真正的挑戰是有一個更大的查詢,它必須適合。如果我創建子查詢,會有連接進入畫面。我的簡單問題是 - 我想在行級別計算某些結果並將其用於計算多列 – Dhiraj

+0

它應該像在與Hive中的橫向視圖一起使用時的json_tuple行爲一樣。它保持單行凍結,我們可以在主查詢中多次使用該行內的成員,而無需任何聯接。但不是json_tuple我有其他函數返回一個Map現在我想要訪問的地圖的成員來計算N個不同的列。 – Dhiraj

+0

子查詢不一定加入,在我的回答中,這不是一個加入。您也可以使用WITH c(sbquery here ...)作爲subq1,然後在更復雜的查詢中引用它作爲subq1,即使對於連接,子查詢也會計算一次。你提到的橫向視圖基本上是一個連接。 – leftjoin