2015-07-28 27 views
1

我在蜂巢中有外部表,我試圖運行從table_name查詢select count(*),但查詢返回瞬時並給出我認爲已存儲的結果。查詢返回的結果不正確。有沒有辦法強制地圖縮減作業,並使查詢每次都執行。配置單元計數(*)查詢未調用mapreduce

注意:所有外部表格都不遵循此行爲,但其中一些外部表格遵循此行爲。使用

版本:蜂巢0.14.0.2.2.6.0-2800,Hadoop的2.6.0.2.2.6.0-2800(Hortonworks)

+0

對於Hive執行計數(*),不需要MR作業。你能提供更多細節來證明結果是錯誤的嗎? – void

+0

我正在做行計數(wc -l)檢查行數,我的數據格式是獸人,所以這是正確的方法來檢查? – Anup

回答

0

做對ORC的數據wc -l不會給你一個準確的結果,因爲數據是編碼的。如果數據以簡單的文本文件格式存儲,並且每行一行,則這將起作用。

配置單元不需要爲ORC文件的count(*)啓動MapReduce,因爲它可以使用ORC元數據來確定總數。

使用orcfiledump命令從上ORC表通常返回錯誤人物的命令行

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+ORC#LanguageManualORC-ORCFileDumpUtility

0

從個人的經驗,COUNT(*)分析ORC的數據 - 即它返回數第一行僅限數據文件。如果表格是由多個INSERT提供的,那麼你就被卡住了。

使用V0.13,您可以通過添加虛擬「where 1 = 1」子句來欺騙優化器運行虛擬M/R作業 - 需要更長的時間,但實際上會對這些行進行計數。

隨着0.14優化器變得更聰明,你必須添加一個非確定性的子句,例如, 「MYKEY爲空」。假設MYKEY是一個字符串,否則「is null」子句可能會導致您的查詢崩潰 - 另一個醜陋的ORC錯誤。

順便說一句,分區鍵上的SELECT DISTINCT也會返回錯誤的結果 - 將顯示所有現有分區,即使是空分區也是如此。這次不是特定於ORC。

1

經過一番探索後,我得到了一個方法,可以啓動MR來計算orc表上的記錄數。

ANALYZE TABLE '表名' PARTITION('分區列')計算統計; - 或 ANALYZE TABLE '表名' COMPUTE STATISTICS;

這不是count(*)的直接替代方法,但提供了表中最新的記錄數。

0

請嘗試以下:在你的蜂巢會議

蜂巢>設置hive.fetch.task.conversion =無在蜂巢會話,然後觸發SELECT COUNT(*)操作,強制的MapReduce