資料庫 HIVE SQL索引及其使用

2021-09-17 18:25:52 字數 2516 閱讀 5960

最近在用一張8億資料量表作為主表去關聯乙個千萬量級的表時遇到乙個問題,job執行的特別慢,而且大量的時間花費在了大表的查詢上。如何解決這個問題,首先想到是不是由於資料偏移造成的,對應了各種資料偏移的場景,最後認定不是資料偏移造成的。那怎麼辦呢?後來想到用索引!由於對於索引不是特別了解,查了各種資料,這裡做乙個總結,加深對索引的理解。

hive中如何建立索引?

最最最重要的,是要先建表,並且對錶的儲存方式有要求(如果你所建的表本身是如下方式建立的,那麼忽略這一步):

use dw_htldatadb;

drop table table;

create table table(

aa string comment 'asd',

bb int comment 'asd'

) comment 'table comment'

partitioned by(d string comment 'date')

row format delimited fields terminated by ','

stored as textfile;

如果你按照下面這種方式建表,那麼,你之後可能會遇到,再重建索引時,報錯的情況(這裡我真的不知道為啥子,只是在嘗試過程中,發現了這個坑)

use dw_htldatadb;

drop table table;

create table table(

aa string comment 'asd',

bb int comment 'asd'

) comment 'table comment'

partitioned by(d string comment 'date')

row format delimited fields terminated by ','

stored as orc;

建立索引,這裡注意的是,我在查資料時,看到有小夥伴用了分割槽建立索引的方法,但是我並沒有試驗成功,不知道是否和hive版本有關,所以,我用的是最常用的方式建立的索引。

成功版本:對錶table的aa列建立索引

use database;

create index idx_table on table table(aa)

as 'org.apache.hadoop.hive.ql.index.compact.compactindexhandler'

with deferred rebuild

in table tablen_index;

未成功版本:

use database;

create index idx_table on table table(eid)

as 'org.apache.hadoop.hive.ql.index.compact.compactindexhandler'

with deferred rebuild

in table table_index

partitioned by (d,eid)

;

重建索引,這裡,如果你的表已經有分割槽有資料,那麼你可以對單個分割槽重建索引,也可以對整個表建立索引,但通過實踐,是在表中未產生資料時,建立索引比較快,而且在你的表再次插入資料時,也不需要再執行此操作。

對錶重建索引:

use database;

alter index idx_table rebuild;

對錶的分割槽重建建索引:

use database;

alter index idx_table partition (d = '2019-04-01') rebuild ;

建立好之後,就可以對錶進行操作了。

重建之後可以顯示索引:

show formatted index on table;
案例結果:

idx_name

tab_name

col_names

idx_tab_name

idx_type

comment

idx_tmp_ceshi

tmp_ceshi

eidtmp_ceshi_index

compact

想要索引在查詢時生效,還需要設定引數,預設情況下不使用索引。

set hive.input.format=org.apache.hadoop.hive.ql.io.hiveinputformat;

set hive.optimize.index.filter=true;

set hive.optimize.index.filter.compact.minsize=0;

這個部分也解決了我大表查詢時間長的問題,再把大表建成索引表,再去關聯時,和之間相比,時間縮短了一半,不過,索引有自身的試用情況,用時還是需要了解使用的場景的。下個小節會對分桶進行**,這也是優化job的乙個方向。

Hive SQL 之 資料庫

1 hive 中的資料庫本質是乙個目錄,通常資料庫儲存在hive.metastore.warehouse.dir所指定的目錄下,以.db為字尾,例如testdb.db,該資料庫中的表以這個資料庫目錄的子目錄存在。注 default這個資料庫是hive預設的資料庫,若不指定資料庫,這預設使用該資料庫。...

資料庫索引及其工作原理

我們通過乙個簡單的例子來開始教程,解釋為什麼我們需要資料庫索引。假設我們有乙個資料庫表 employee,這個表有三個字段 列 分別是 employee name employee age 和employee address。假設表employee 有上千行資料。現在假設我們要從這個表中查詢出所有名...

資料庫 資料庫索引

索引是儲存引擎用於快速找到記錄的一種資料結構。索引以檔案的形式儲存在磁碟中。索引可以包含乙個或多個列的值。儲存引擎查詢資料的時候,先在索引中找對應值,然後根據匹配的索引記錄找到對應的資料行。1.b tree索引 2.雜湊索引 myisam和innodb儲存引擎 只支援btree索引,也就是說預設使用...