hive orc表'orc.create.index'='true'與'orc.create.index'='false'

joshliu發表於2021-02-23

hive ORC檔案儲存格式是以列存的方式,在查詢表中少數列資料,不必要去查詢沒條資料的所有欄位;但是如果一個列的值全部儲存一起,查詢一個列的一條資料,會將整個表該列的所有資料都查詢出來,如果資料量很大,查詢速度依然很慢;然後引入orc.create.index(行組索引),行組索引就能解決以上的問題;

概念解釋:

行組索引:

如下圖:

        表一為傳統資料儲存,按行儲存,如果沒有儲存索引的話,查詢一個欄位,需要把整行查詢出來;

        表二為orc行組索引,首先資料按照列存方式儲存,然後按照一個單位值(10000行)組成一個行組,查詢時,在orc的 每個行組索引的後設資料(後設資料 記錄了行組下每個列的最小值、最大值、和等資訊)匹配查詢條件,資料查詢掃描對應的行組,從而達到優化查詢的目錄;

        非行組索引的orc表,則orc後設資料沒有 每個列的最小值、最大值、和等資訊,查詢時,資料掃描會進行全表掃描,不能達到查詢優化的目的;


常見orc建表語句如下:

CREATE TABLE T (C1 INT,C2 INT)STORED AS ORC; 
-- 建立帶有行組索引的orc空表(預設情況下建立orc表,是帶有orc.create.index=true屬性的)
CREATE TABLE T (C1 INT,C2 INT)STORED AS ORC TBLPROPERTIES('orc.create.index'='true');
-- 建立帶有行組索引的orc空表
CREATE TABLE T (C1 INT,C2 INT)STORED AS ORC TBLPROPERTIES('orc.create.index'='false');
-- 建立不帶有行組索引的orc空表
create TABLE T stored AS ORC TBLPROPERTIES('orc.create.index'='true') as select * from T_TMP;
-- 建立帶有行組索引的orc表,如果T_TMP有資料,建立T表時也會進行資料載入
create TABLE T stored AS ORC TBLPROPERTIES('orc.create.index'='false') as select * from T_TMP;
-- 建立不帶有行組索引的orc表,如果T_TMP有資料,建立T表時也會進行資料載入


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69985104/viewspace-2758737/,如需轉載,請註明出處,否則將追究法律責任。

相關文章