2014-07-08 24 views
4

比方說,我有一個大的表,由dt字段劃分。我想在特定日期後查詢此表的數據。例如。子查詢在`與哪裏`比較運算符

select * from mytab where dt >= 20140701; 

棘手的部分是日期不是一個常數,而是來自一個子查詢。所以基本上我想是這樣的:

select * from mytab where dt >= (select min(dt) from activedates); 

蜂房不能做到這一點,但是,給我上子查詢ParseException(從文檔我猜它只是尚不支持)。

那麼如何限制我的查詢基於動態子查詢?

注意,這裏的性能是關鍵。所以越快越好,即使它看起來更醜。

另外請注意,我們還沒有切換到Hive 0.13,所以沒有in查詢的解決方案是首選。

回答

5

Hive在構建執行計劃時決定分區修剪,因此在執行之前必須具有max(dt)的值。

目前唯一的方法就是將查詢分爲兩部分,第一部分是select min(dt) from activedates,其結果將放入一個變量中。
第二個查詢將是:select * from mytab where dt >=${hiveconf:var}

現在這有點棘手。
你既可以執行第一查詢到OS變量,像這樣:

a=`hive -S -e "select min(dt) from activedates"` 

然後運行像這樣的2nnd查詢:

hive -hiveconf var=$a -e "select * from mytab where dt >=${hiveconf:var}" 

或事件只是:

hive -e "select * from mytab where dt >=$a" 

或者,如果您使用某種其他腳本語言,則可以替換代碼中的變量。