1. 程式人生 > >Hive知識點總結(一)

Hive知識點總結(一)

眾所周知實際開發過程中,Hive主要是通過其豐富的內建函式,便捷的類sql來處理經過MapReduce清洗後的資料,下面我們進行Hive的知識點總結。

1、Hive使用方式

方式1:學習時使用的最基本的簡單查詢: 

bin/hive //啟動hive
hive>select * from t_test;  //進行簡單使用

方式2:作為服務啟動並使用:

bin/hiveserver2 -hiveconf hive.root.logger=DEBUG,console //前臺啟動
nohup bin/hiveserver2 1>/dev/null 2>&1 &  //後臺啟動

通過服務啟動成功後,可以去別的節點,通過beeline來連線使用

連線方式1:

bin/beeline  //回車,進入beeline的命令介面

進入beeline命令介面後輸入:

beeline> !connect jdbc:hive2//mini1:10000  //mini1是hiveserver所啟動的那臺主機名,埠預設是10000

然後就可以正常進行Hive操作了

連線方式2:

在啟動的時候連線

bin/beeline -u jdbc:hive2://mini1:10000 -n root

接下來就可以進行Hive操作了

方式3:指令碼化執行使用

在實際的生產過程中,上述兩種方法由於是互動式查詢,效率會比較低,無法應對大量的Hive查詢任務。因此,更多的會選擇指令碼化執行機制,該機制的核心是Hive可以用一次性命令的方式來執行給定的HQL語句。

比如,可以將sql語句寫入shell指令碼,以便於指令碼化執行hive任務,並可以控制、排程眾多的hive任務:

vi t_order_etl.sh
#!/bin/bash
hive -e "select * from db_order.t_order"
hive -e "select * from default.t_user"
hql="create table  default.t_bash as select * from db_order.t_order"
hive -e "$hql"

然後執行該shell即可,當然如果sql比較複雜的話,上述方式就不可取了,我們可以把hql語句寫入檔案中:

vi x.hql
select * from db_order.t_order;
select count(1) from db_order.t_user;

然後使用hive -f x.hql來執行即可。

2、建立庫表、資料匯入匯出及檔案格式

2.1、建立庫

hive中有一個預設的庫:
庫名: default
庫目錄:/hive安裝目錄/warehouse

新建庫:
create database db_order;
庫建好後,在hdfs中會生成一個庫目錄:
hdfs://hdp20-01:9000/user/hive安裝目錄/warehouse/db_order.db

2.2、建立表

use db_order;
create table t_order(id string,create_time string,amount float,uid string);

表建好後,會在所屬的庫目錄中生成一個表目錄
/user/hive/warehouse/db_order.db/t_order
只是,這樣建表的話,hive會認為表資料檔案中的欄位分隔符為 ^A

因此正確的建表語句為:

create table t_order(id string,create_time string,amount float,uid string)
row format delimited
fields terminated by ',';

這樣就指定了,我們的表資料檔案中的欄位分隔符為 ","

2.2.1、建立外部表

預設情況下建立的表稱為內部表(MANAGED_TABLE),外部表(EXTERNAL_TABLE)關鍵字:external,需要自己指定表目錄存放地址:

create external table t_3(id int,name string,salary bigint,add string)
row format delimited
fields terminated by ','
location '/aa/bb';
外部表和內部表的特性差別:
1、內部表的目錄在hive的倉庫目錄中 ,而外部表的目錄由使用者指定;
2、drop一個內部表時:hive會清除相關元資料,並刪除表資料目錄;

3、drop一個外部表時:hive只會清除相關元資料。

因此實際開發中:

一個hive的資料倉庫,最底層的表,一定是來自於外部系統,為了不影響外部系統的工作邏輯,在hive中可建external表來對映這些外部系統產生的資料目錄,並且就算在hive中把這個表給drop掉,也不會刪除資料目錄,也就不會影響到別的應用系統;然後在後續的etl操作,產生的各種表建議用managed_table。

2.2.2、建立分割槽表

分割槽的意義在於可以將資料分子目錄儲存,以便於查詢時讓資料讀取範圍更精準;

比如,網站每天產生的瀏覽記錄,瀏覽記錄應該建一個表來存放,但是,有時候,我們可能只需要對某一天的瀏覽記錄進行分析
這時,就可以將這個表建為分割槽表,每天的資料匯入其中的一個分割槽;當然,每日的分割槽目錄,應該有一個目錄名(分割槽欄位)。

create table t_4(ip string,url string,staylong int)
partitioned by (day string) -- 分割槽標識不能存在於表字段中
row format delimited
fields terminated by ',';

2.2.3、CTAS建表

(1)可以通過已存在表來建表:

create table t_user_2 like t_user;

新建的t_user_2表結構定義與源表t_user一致,但是沒有資料

(2)在建表的同時插入資料:

create table t_access_user
as
select ip,url from t_access;

t_access_user會根據select查詢的欄位來建表,同時將查詢的結果插入新表中。

2.3、匯入資料

方式1:匯入資料的一種方式:

手動用hdfs命令,將檔案放入表目錄;

方式2:在hive的互動式shell中用hive命令來匯入本地資料到表目錄:

hive>load data local inpath '/root/order.data.2' into table t_order;

方式3:用hive命令匯入hdfs中的資料檔案到表目錄:

不加local關鍵字,則是從hdfs的路徑中移動檔案到表目錄中:

hive>load data inpath '/access.log.2017-08-06.log' into table t_access partition(dt='20170806');
hive>load data inpath '/user.data.2' into table t_1;
注意:導本地檔案和導HDFS檔案的區別:
本地檔案匯入表:複製

hdfs檔案匯入表:移動

2.4、匯出資料

(1)將hive表中的資料匯入HDFS的檔案:

insert overwrite directory '/root/access-data'
row format delimited fields terminated by ','
select * from t_access;

(2)將hive表中的資料匯入本地磁碟檔案:

insert overwrite local directory '/root/access-data'
row format delimited fields terminated by ','
select * from t_access limit 100000;

2.5、檔案格式

HIVE支援很多種檔案格式: SEQUENCE FILE | TEXT FILE | PARQUET FILE | RC FILE

create table t_access_text(ip string,url string,access_time string)
row format delimited fields terminated by ','
stored as textfile;