Hive-內部表&外部表&分區表&擴展命令

先看下如何建立數據表

create [external] table if not exists 表名node

(列名數據類型 [comment 本列註釋],...)安全

[comment 表註釋]session

[partitioned by (列名數據類型 [comment 本列註釋],...)]函數

[clustered by(列名,列名,...)]性能

[sorted by (列名 [asc|desc],...)] info num_buckets buckets]spa

[row format row_format][stored as file_format].net

[location hdfs_path]code

[tblproperties (property_name=property_value,...)]orm

[as select_statement]blog

說明:

①external表示建立外部表;hive在建立內部表時,會將數據移動到數據倉庫指向的路徑;若建立外部表,僅記錄數據所在的路徑,不對數據的位置作任何改變

②partitioned by表示建立分區表

③clustered by建立分桶表

④sorted by 不經常使用

⑤row format delimited [fields terminated by char] [collection items terminated by char] [map keys terminated by char] [line terminated by char]

⑥stored as 指定文件存儲類型(sequencefile二進制文件、textfile文本文件、rcfile列式存儲格式)

⑦location 指定表在hdfs上的存儲位置

⑧like 容許用戶複製現有的表結構,可是不復制數據

⑨as 後跟查詢語句,根據查詢結果建立表

查看數據表結構:

desc formated 表名;  //能夠查看分區字段(partition)信息
desc 表名;

external:表示建立外部表,僅記錄數據所在路徑,不對數據作改變

不寫external:表示建立內部表,會將數據移動到數據倉庫指向的路徑。

內部表&外部表區別

  • 內部表也叫管理表,數據由Hive自身管理,外部表數據由HDFS管理
  • 內部表數據存儲的位置是hive.metastore.warehouse.dir(數據倉庫地址默認:/user/hive/warehouse
  • 外部表數據的存儲位置由本身制定(若是沒有LOCATION,Hive將在HDFS上的/user/hive/warehouse文件夾下之外部表的表名建立一個文件夾,並將屬於這個表的數據存放在這裏)
  • 刪除內部表會直接刪除元數據(metadata)及存儲數據
  • 刪除外部表僅僅會刪除元數據,HDFS上的文件並不會被刪除
  • 對內部表的修改會將修改直接同步給元數據,而對外部表的表結構和分區進行修改,則須要修復(MSCK REPAIR TABLE table_name;)

使用場合:

一、但願作數據備份而且不常常改變的數據,存放在外部表能夠減小失誤操做。

二、數據清洗轉換後的中間結果,能夠存放在內部表,由於Hive對內部表支持的功能比較全面,方便管理。

三、處理完成的數據因爲須要共享,能夠存儲在外部表,這樣可以防止失誤操做,增長數據的安全性。

四、在生產中通常建立外部表來存儲數據。

修改表

修改表名

alter table A_A rename TO AA;

向表中添加列

ALTER TABLE A_A ADD COLUMNS (
                   a_name   STRING  COMMENT  ' App  name ' ,
                 a_id BIGINT COMMENT ' The current session id');

修改列名

ALTER TABLE 表名 change 原列名 新列名 新類型;

(慎用)刪表:

drop table if exists table_name;

(慎用)清空表:

truncate table 表名;

 

 擴展:

在Hive中查看函數功能(好比substr)

desc function extended substr;

 查看全部Hive函數

show functions;

殺死進程 -好比有一個進程爲 :11245 RunJar

kill -9 11245;

 


分區表

分區表:在必定程度上能夠理解爲分紅文件夾。

Hive中有分區表的概念,咱們能夠看到分區具備重要性能優點,分區表能夠將數據以一種符合邏輯的方式進行組織,好比分層存儲。
二、查詢分區表中的數據時,除非where語句中包含分區字段過濾條件來顯示數據範圍,不然不容許執行。
三、換句話說,就是用戶不容許掃描全部的分區
四、進行這個顯示的緣由是,一般分區表都擁有很是大的數據集,並且數據增長迅速。若是沒有進行分區限制的查詢可能會消耗使人不可接受的巨大資源來處理這個表。
五、分區是hive存放數據的一種方式。將列值做爲目錄來存放數據,就是一個分區。這樣查詢時使用分區列進行過濾,只需根據列值直接掃描對應目錄下的數據,不掃描其餘不關心的分區,快速定位,提升查詢效率.

分區表分位靜態分區和動態分區

靜態分區:手動指定-->編譯時期。

動態分區:經過輸入數據來進行判斷-->SQL語句。

通常按時間來分區:天,小時,分鐘。

靜態分區:

create table test
(name string,age int)
partitioned by (country string)
row format delimited fields terminated by '\t'
lines terminated by '\n'
stored as textfile;

向分區中插入數據:

insert into table test partition(country="china")
values("zhangsan",1);
insert into table test partition(country="usa")
values("james",34);
insert into table test partition(country="usa")
values("tom",2);

查詢分區表的數據:

select * from test where country="china";

刪除分區:

alter table test drop partition(country="china");

加載數據指定分區:

load data local inpath '/root/Desktop/student.txt' into table test partition(name='zs',age=21);

動態分區:

動態分區的相關配置屬性:

set hive.exec.dynamic.partition=true;
(可經過這個語句查看:set hive.exec.dynamic.partition;)
set hive.exec.dynamic.partition.mode=nonstrict;
SET hive.exec.max.dynamic.partitions=100000;(若是自動分區數
大於這個參數,將會報錯)
SET hive.exec.max.dynamic.partitions.pernode=100000;

顯示分區數:

show partitions order_part;

查詢分區表中的數據:

select * from user_trade limit 6;  //這樣會報錯,由於沒有加分區條件。

查看全部配置

set

 嚴格模式:set hive.mapred.mode=strict;

set hive.mapred.mode=strict;
select * from user_trade limit 6;
select * from user_trade where dt='2017-01-12';

嚴格模式限制3種查詢:

咱們應該

一、對分區表查詢,用where過濾字段用分區字段。

二、禁止用笛卡爾積join查詢,join查詢語句,不帶on條件或者where條件。

三、order by後面用limit。

 

擴展:hive分桶

一、分桶是對列值取hash值的方式將數據放在不一樣的文件存儲。

二、hive中的每個表、分區均可以進行分桶。

三、由列的hash值除以桶的個數來決定將每條數據具體劃分在哪一個桶中。

應用場景:抽樣、map-join

分桶我用的比較少,具體內容可自行百度。

 

參考文獻:

https://blog.csdn.net/qq_39783601/article/details/104934245,

https://blog.csdn.net/MrBack/article/details/82379995,

開課吧

相關文章
相關標籤/搜索