1. 參考文檔
https://github.com/apache/carbondata/blob/master/docs/hive-guide.md
2. 問題呈現(xiàn)
- select * from test_carbon;沒有數(shù)據(jù)
- select count(1) from test_carbon;有值
- select distinct name from test_carbon 有值;
3. 調(diào)試步驟
- 由于hive讀取carbon是使用的serde方式;社區(qū)單獨把這塊拿出來建成一個子項目,位于carbondata/integration/hive里面;前面讀取時使用的carbondata整個集成包來測的,這時由于要多次編譯代碼,使用此子項目,依賴core,comman,hadoop這三個carbondata內(nèi)的子項目。
- 依次編譯這幾個項目內(nèi),根據(jù)carbondata大牛(昆哥)的建議,開始往MapredCarbonInputFormat的getSplits方法內(nèi)加日志,打印文件分片信息;調(diào)試后發(fā)現(xiàn)沒有日志;
- 再接著看splitList size為0,最后加到getSplits第一行,還是沒有日志;
-
早上一直沒想通,后來看select 返回的速度,感覺特別快;確定肯定是不同的查詢方式;猛然想起select limit好像不走mapreduce,就去查了,查到一個配置項:hive.fetch.task.conversion,默認值為minimal;從圖片中可以看到,此配置值選項有三個,more,minimal,還有一個None,不使用此配置。首先設置為None,再select * from,值出來了;再設置剩下的兩個都沒有值;這個配置項控制是使用直接FetchTask還是啟動mapreduce.此時問題已經(jīng)解決。
image.png -
為了查看為什么這樣,開始下載hive源碼,配置遠程調(diào)試,跟蹤代碼會發(fā)現(xiàn)是直接調(diào)用的FetchTask的fetch方法,里面有一步操作,會列出來表下面的文件,這塊直接調(diào)用的FileSystem的子類DistributedFileSystem,中間沒做處理,直接掃描的目錄。carbondata的表目錄結(jié)構(gòu)是表下面沒有文件,文件在Fact/Part0/segmentXXX/files,掃描的文件數(shù)量為0,故查不出來數(shù)據(jù)。
image.png
6.為了二次驗證以上結(jié)論,把其中一個表的數(shù)據(jù)從segment里面拷貝到表根目錄下面,立刻就能查出來結(jié)果。
image.png
image.png



