先看下如何創建數據表 create [external] table if not exists 表名 (列名數據類型 [comment 本列註釋],...) [comment 表註釋] [partitioned by (列名數據類型 [comment 本列註釋],...)] [clustered ...
先看下如何創建數據表
create [external] table if not exists 表名
(列名數據類型 [comment 本列註釋],...)
[comment 表註釋]
[partitioned by (列名數據類型 [comment 本列註釋],...)]
[clustered by(列名,列名,...)]
[sorted by (列名 [asc|desc],...)] info num_buckets buckets]
[row format row_format][stored as file_format]
[location hdfs_path]
[tblproperties (property_name=property_value,...)]
[as select_statement]
說明:
①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;)
使用場合:
1、希望做數據備份並且不經常改變的數據,存放在外部表可以減少失誤操作。
2、數據清洗轉換後的中間結果,可以存放在內部表,因為Hive對內部表支持的功能比較全面,方便管理。
3、處理完成的數據由於需要共用,可以存儲在外部表,這樣能夠防止失誤操作,增加數據的安全性。
4、在生產中一般創建外部表來存儲數據。
修改表
修改表名
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中有分區表的概念,我們可以看到分區具有重要性能優勢,分區表可以將數據以一種符合邏輯的方式進行組織,比如分層存儲。
2、查詢分區表中的數據時,除非where語句中包含分區欄位過濾條件來顯示數據範圍,否則不允許執行。
3、換句話說,就是用戶不允許掃描所有的分區。
4、進行這個顯示的原因是,通常分區表都擁有非常大的數據集,而且數據增加迅速。如果沒有進行分區限制的查詢可能會消耗令人不可接受的巨大資源來處理這個表。
5、分區是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種查詢:
我們應該
1、對分區表查詢,用where過濾欄位用分區欄位。
2、禁止用笛卡爾積join查詢,join查詢語句,不帶on條件或者where條件。
3、order by後面用limit。
擴展:hive分桶
1、分桶是對列值取hash值的方式將數據放在不同的文件存儲。
2、hive中的每一個表、分區都可以進行分桶。
3、由列的hash值除以桶的個數來決定將每條數據具體劃分在哪個桶中。
應用場景:抽樣、map-join
分桶我用的比較少,具體內容可自行百度。
參考文獻:
https://blog.csdn.net/qq_39783601/article/details/104934245,
https://blog.csdn.net/MrBack/article/details/82379995,
開課吧