日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯網營銷解決方案
你知道Hive統(tǒng)計函數count(*)為什么不走MR嗎?

問題

Hive執(zhí)行count(*)不走MR呢?

先說結論:如果表數據是insert進表的,count(*)統(tǒng)計時,帶where條件執(zhí)行時候Hive會執(zhí)行MR,如果不帶where條件,Hive會從元數據庫表metastore.TABLE_PARAMS中直接獲取numRows字段的值獲取記錄數。下面創(chuàng)建表進行驗證,在驗證時發(fā)現了Hive在無條件count(*)統(tǒng)計中的一個bug,bug現象也會下面驗證。

創(chuàng)建測試表

create database testdb;
use testdb;
--測試hive
create table test(
id int comment 'id'
)comment '測試hive'
insert into test values('1001');
select count(*) from test ;
select count(*) from test where id>=1001;

hive表存儲位置

表描述信息

hdfs上生成了數據

數據內容

從上面兩個圖上可以看到建表后插入一條記錄,會在metastore.TABLE_PARAMS 表中記錄該表的信息,并且用numRows記錄該表的數量,查看HDFS該表所在的路徑生成了000000_0的文件,下載下來查看確實是1001。

執(zhí)行count(*)

不帶where條件執(zhí)行:查詢非???,也并沒有走MR。

不帶where條件執(zhí)行結果

帶where條件執(zhí)行:查詢比較慢,且走了MR。

可以驗證Hive不帶where條件的執(zhí)行不走MR,而是直接從元數據里獲取表的行數,這也算是一種優(yōu)化,畢竟Hive存儲的數據大多是T+1的數據,數據寫入后一般不會改變。

Hive的一個bug

本地創(chuàng)建一個ids.txt文件,通過hadoop fs -put 命令上傳到表映射路徑/user/hive/warehouse/testdb.db/test上。

創(chuàng)建文件并上傳到表路徑。

hdfs文件下載并查看結果

執(zhí)行不帶where條件的count(*)結果就是錯誤的,而帶where條件的是正確的。

然后通過Hive執(zhí)行帶條件和不帶條件的查詢結果發(fā)現,不帶where條件中的查詢結果是1,而帶where條件的結果是3,說明直接通過hadoop fs -put把文件上傳到路徑的方式會導致Hive在沒有條件的統(tǒng)計下結果是錯誤的,也側面證明了無條件的count(*)是從元數據庫直接取的數據,而用select * 查詢時結果卻是正確的。

解決方法

要解決上面問題,可以使用Load data指令導入數據,但是有如下幾點要注意:

  • 有LOCAL表示從本地文件系統(tǒng)加載,文件會被拷貝到HDFS中。
  • 無LOCAL表示從HDFS中加載數據,文件直接被移動,而不是拷貝。
  • OVERWRITE 表示是否覆蓋表中數據(或指定分區(qū)的數據),沒有OVERWRITE 會直接APPEND,而不會濾重。
  • 如果加載同樣文件名的文件,會被自動重命名。

load data

用load data指令上傳完數據后,再次用無條件的count(*)統(tǒng)計結果,發(fā)現Hive又走了MR統(tǒng)計,并且結果是正確的。

總結

用insert into 的方式插入到Hive表數據時,元數據會記錄插入的數量,為了優(yōu)化查詢,無條件count(*)查詢時直接查元數據中記錄的numRows字段,導致結果不準確。


分享標題:你知道Hive統(tǒng)計函數count(*)為什么不走MR嗎?
當前URL:http://www.dlmjj.cn/article/djgeoep.html