先看下如何創建資料表
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,
開課吧
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/3128.html
標籤:大數據
