1. 程式人生 > >Hive學習(二)知識點整理

Hive學習(二)知識點整理

Hive

一、什麼是Hive?

Hive是基於Hadoop的一個數據倉庫工具,可以將結構化的資料檔案對映為一張資料庫表,並提供的sql查詢功能,可以將sql語句轉換為MapReduce任務進行執行。
Hive的優點:
其優點是學習成本低,可以通過類SQL語句快速實現簡單的MapReduce統計,不必開發專門的MapReduce應用,十分適合資料倉庫的統計分析。

二、Hive可以做什麼?

  1. 可以更加簡潔的訪問HDFS。
  2. 可以直接通過sql直接使用訪問Mapreduce等框架。
  3. 可以把多種資料進行格式化或者結構化管理。
  4. 處理ETL型別的業務。( Extract-Transform-Load 抽取、轉換、載入)。

三、Hive的表種類

1、內部表(受控表)
完全被Hive控制,內部表刪除,元資料、源資料一同被刪除。
2、臨時表
生命週期是一次會話,主要用於測試。
建立臨時表:create TEMPORARY table ttabc(id Int,name String)
3、外部表
不是完全受Hive控制,源資料可以在任何的目錄下,刪除外部表,源資料不會被刪除,只是刪除元資料。

建立外部表:

create external table wc_external 
  (word1 STRING, 
   word2 STRING) 
   ROW FORMAT DELIMITED 
   FIELDS TERMINATED BY ' ' 
   location '/test/external';

注:location可加可不加,不加location預設是在hive的工作目錄區

問題:

  1. 如果按照外部表的規則(欄位格式)建立一個新的檔案。
    將這個檔案拷貝到工作目錄區中,然後查詢這個外部表發現數據量增多。
  2. load data inpath “/test/exeternal/t” into table wc_exeternal;
    將工作目錄區中的檔案再次新增到這個表中,發現數據量沒有增量。
  3. load data inpath “/t” into table wc_exeternal;
    資料量增多了,但是根目錄的t檔案被剪下了。

4. 分割槽表
將源資料分到不同的Hive工作目錄中儲存,一個分割槽對應一個目錄,防止暴力掃描全表。
靜態分割槽表:
分割槽是由使用者自定義的。

(1)單分割槽表
建立單分割槽表:

create table day_table (id int, content string) partitioned by (dt string) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' ;

載入資料:
①單條插入的方式往分割槽表中插入資料:

insert into day_table partition (dt = "9-26") values(1,"and");

②批量插入的方式往分割槽表中插入資料:

oad data local inpath "/root/ceshi" into table day_table partition (dt="9-27");

(2)多分割槽表

建立多分割槽表:

create table day_hour_table (id int, content string) partitioned by (dt int,hour int) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' ;

載入資料:
①單條插入的方式往分割槽表中插入資料:

insert into day_hour_table partition(dt=9,hour=1) values(1,"a2 bc");

②批量插入的方式往分割槽表中插入資料:

load data local inpath "/root/ceshi" into table day_table partition (dt=10,hour=10);

刪除Hive分割槽表中的分割槽:

ALTER TABLE day_table DROP PARTITION (dt=10,hour=10);

動態分割槽表:
動態分割槽可以根據資料本身的特徵自動來劃分分割槽(比如我們可以指定按照資料中的年齡、性別來動態分割槽)
靜態分割槽與動態分割槽建立表的語句是一模一樣的。

查詢分割槽數:

show partitions gfstbl_dynamic;

5、分桶表
分桶表是由列的雜湊值除以桶的個數來決定每條資料劃分在哪個桶中分成不同的桶進行儲存,方便隨機取樣以及join等操作。

建立分桶表:

CREATE TABLE psnbucket( id INT, name STRING, age INT) 
CLUSTERED BY (age) INTO 4 BUCKETS 
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',';

四、Hive建立表的三種方式

方式一(普通方式):

CREATE TABLE test(
  id INT,
  name STRING,
  age INT,
  gfs ARRAY<STRING>,
  address MAP<STRING,STRING>,
  info STRUCT<country:String,province:String,shi:String>
)

方式二:

create table test1 like test;

注意:只是建立表結構
方式三:

create table test2 AS SELECT id,name,gfs,address from test1; 

不僅會建立相應的表結構,並且會插入資料

五、Hive插入資料的方式

1、Insert

INSERT INTO TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1 FROM from_statement;

2、Load

load data local inpath '/root/test.txt' into table test;

3、查詢其它表資料Insert到新表中

insert into rest select count(*) from table;

六、Hive檢視

Hive檢視與MySql資料庫的檢視一樣。其特點有:

  1. 只能查詢,不能做載入資料操作。
  2. 檢視的建立,只是儲存一份元資料,只有查詢檢視時,才進行相應操作。
  3. 檢視一旦建立,無法修改。
  4. 若檢視中包含了ORDER BY/LIMIT語句,當查詢檢視時也進行ORDER BY/LIMIT語句操作,檢視當中定義的優先順序更高。

問題:
在建立檢視的時候會不會啟動MR任務?
不會,檢視的建立,只是儲存一份元資料,查詢檢視時才執行對應的操作。

檢視已建立的檢視:

show tables

刪除檢視:

drop view view1

七、Hive索引

什麼是索引?
索引類似目錄,使用索引可以優化查詢效能。
索引庫,用於儲存一些索引的元資料。

建立索引:

create index t1_index on table psn2(name) 
as 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler' 
with deferred rebuild in table t1_index_table;

查詢索引:

show index on psn2;

刪除索引:

DROP INDEX IF EXISTS t1_index ON psn2; //刪除索引的同時,索引庫也會被刪除

八、Hive環境搭建和部署

Hive的搭建方式有三種:

  1. 本地模式
  2. 基於MySql的Local模式
  3. 基於MySql的Remote模式

搭建步驟可參考—Hive的三種搭建方式