hive orc表'orc.create.index'='true'与'orc.create.index'='false'
hive orc表'orc.create.index'='true'与'orc.create.index'='false'
hive ORC文件存储格式是以列存的方式,在查询表中少数列数据,不必要去查询没条数据的所有字段;但是如果一个列的值全部存储一起,查询一个列的一条数据,会将整个表该列的所有数据都查询出来,如果数据量很大,查询速度依然很慢;然后引入orc.create.index(行组索引),行组索引就能解决以上的问题;
概念解释:
行组索引:
如下图:
表一为传统数据存储,按行存储,如果没有存储索引的话,查询一个字段,需要把整行查询出来;
表二为orc行组索引,首先数据按照列存方式存储,然后按照一个单位值(10000行)组成一个行组,查询时,在orc的 每个行组索引的元数据(元数据 记录了行组下每个列的最小值、最大值、和等信息)匹配查询条件,数据查询扫描对应的行组,从而达到优化查询的目录;
非行组索引的orc表,则orc元数据没有 每个列的最小值、最大值、和等信息,查询时,数据扫描会进行全表扫描,不能达到查询优化的目的;
常见orc建表语句如下:
1 2 3 4 5 6 7 8 9 10 | 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/,如需转载,请注明出处,否则将追究法律责任。