關於HIVE的SELECT count(*) 優化

NO IMAGE

剛剛下載了一份HIVE的最新原始碼。

印象最深的是HIVE將表的大小作為了後設資料儲存在了關聯式資料庫中。

譬如在老版本中執行如下的語句:

from base insert overwrite table user select * ;

你會發現日誌的末尾會有 “999 ROWD LOADED INTO TABLE USER” 的字樣

代表有999條目記錄儲存在了user表中。

在而在新版本中,執行最後的日誌展示了USER表的後設資料,其中會有ROW_COUNT:999的字樣

一看MYSQL中,999這個資料確實被儲存了起來。

也就是說大家以後不必再用“select count(*) from user ”去查詢user表的大小了,因為HIVE會將這個語句翻譯為MR作業在HADOOP上執行,效率非常低。

新的方法是

            HiveConf
conf = new HiveConf(SessionState.class);
            Hive
hive = Hive.get(conf);
            System.out.println(hive.getTable(“user”).getTTable()
                    .getParameters());
            List
list = hive.getPartitions(hive.getTable(“user”));
            for
(Partition p : list) {
                System.out.println(p.getParameters());
            }

其中列印出來的就是USER表的後設資料。

PS:

   1。有人會問 
select count(1) from user where age=20 這種帶有條件的計數怎麼辦?
        
         別忘記HIVE有分割槽的概念,看到上面的API了嗎,分割槽也是有後設資料的。

   2.   conf是什麼東西?
 
         conf是HIVECONF 
尋找你CLASSPATH路徑下的HIVESITE檔案生成的配置檔案物件。

         將伺服器上的HIVE配置檔案COPY到你的專案中,這個API就可以使用了。