Hive數據表
1.創建數據表
CREATE TABLE IF NOT EXISTS <database>.<table>
name STRING COMMENT 'name',
salary FLOAT COMMENT 'salary',
subordinates ARRAY<STRING> COMMENT 'Names of subordinates',
deductions MAP<STRING, FLOAT> COMMENT 'Keys are deductions names, values are percentages',
address STRUCT<street:STRING, city:STRING, state:STRING, zip:INT> COMMENT ''Home address)
COMMENT 'Description of the table'
TBLPROPERTIES ('creator'='me', 'created_at'='2012-01-02',...)
LOCATION '/user/hive/warehosue/mydb.db/...';
2.查找表
SHOW TABLES IN <database>;
SHOW TABLES '前綴.*'; //正則過濾表名
注:IN <database>和表名正則表達式不能同時使用
3.查看表的詳細表結構
DESCRIBE EXTENDED <database>.<table>; //FORMATTED比EXTENDED內容更詳細
4.創建外部表
CREATE EXTERNAL TABLE IF NOT EXISTS <table>//外部表關鍵字
LOCATION '/目錄';//Hive數據目錄位置
注:刪除該表不會刪除掉這份數據(HDFS目錄下還有這批數據),不過描述表的元數據信息會被刪除
5.拷貝表
CREATE EXTERNAL TABLE IF NOT EXISTS <database>.<new_table>
LIKE <database>.<old_table>
無EXTERNAL關鍵字且源表為外部表,新表為外部表
無EXTERNAL關鍵字且源表為內部表,新表為內部表
有EXTERNAL關鍵字且源表為內部表,新表為外部表
6.分區表
CREATE TABLE <table>(...)
PARTITIONED BY (分區1 數據類型, 分區2 數據類型);
7.分區表全表查詢
set hive.mapred.mode=strict; //禁止提交WHERE沒有加分區過濾的查詢
set hive.mapred.mode=nonstrict; //允許提交WHERE沒有加分區過濾的查詢
8.查詢分區
SHOW PARTITIONS <table> PARTITION(分區='分區值');
9.外部分區表
CREATE EXTERNAL TABLE IF NOT EXISTS log_messages(
hms INT,
severity STRING,
server STRING,
process_id INT,
message STRING)
PARTITIONED BY (year INT, month INT, day INT)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '/t';
//增加一個分區
ALTER TABLE log_messages ADD PARTITION(year = 2012, month = 1,day = 2)
LOCATION 'hdfs://master_server/data/log_message/2012/1/2';
//在廉價機上轉移舊數據
//a.將分區下的數據拷貝到S3中,例如,用戶可以使用hadoop distcp命令:
hadoop distcp /data/log_message/2011/12/02 s3n://ourbucket/logs/2011/12/02
//b.修改表,將分區路徑指向到S3路徑:
ALTER TABLE log_messages PARTITION(year = 2011,month = 12 day = 2)
SET LOCATION 's3n://ourbucket/logs/2011/12/02'
//c.使用hadoop fs -rmr 命令刪除掉HDFS中的這個分區數據:
hadoop fs -rmr /data/log_messages/2011/01/02
10.自定義表的存儲格式
STORED AS TEXTFILE; //每一行被認為是一個單獨的記錄
11.刪除表
DROP TABLE IF EXISTS <table>;
12.修改表
a.表重命名
ALTER TABLE <old_table> RENAME TO <new_table>
b.增加、修改、刪除表分區(通常外部表)
ALTER TABLE <table> ADD IF NOT EXISTS
PARTITION (year = 2011, month = 1, day = 1) LOCATION '/logs/2011/01/01'
PARTITION (year = 2011, month = 1, day = 2) LOCATION '/logs/2011/01/02'
PARTITION (year = 2011, month = 1, day = 3) LOCATION '/logs/2011/01/03'
//同時,可以通過移動位置來修改某個分區的路徑
ALTER TABLE <table> PARTITION(year = 2011, month = 12, day = 2)
SET LOCATION 's3n://ourbucket/logs/2011/01/02';
//不會將數據從舊的路徑轉走,也不會刪除舊的數據,可以通過DROP PARTITION刪除分區;外部表分區內的數據不會被刪除
ALTER TABLE <table> DROP IF EXISTS PARTITION(year = 2011, month = 12, day = 2);
c.修改列信息
ALTER TABLE <table>
CHANGE COLUMN <old_column> <new_column> <new_column_dataType>
COMMENT 'comment'
AFTER/FIRST <other_column>; //移動字段位置,AFTER之后,FIRST之前
d.增加列
ALTER TABLE <table> ADD COLUMNS(
new_column new_column_dataType COMMENT 'comment',
new_column new_column_dataType COMMENT 'comment');
e.刪除或者替換列
//移除之前所有的字段并重新指定了新的字段;移除了server和process_id,只有表的元數據信息改變了,不會修改數據
ALTER TABLE <table> REPLACE COLUMNS(
hours_mins_secs INT COMMENT 'comment',
severity STRING COMMENT 'comment'
message STRING COMMENT 'comment');
f.修改表屬性
//可以增加附加的表屬性或者修改已經存在的屬性,但是無法刪除屬性:
ALTER TABLE <table> SET TBLPROPERTIES(
'notes' = '....');
g.修改存儲屬性
ALTER TABLE <table>
PARTITION(year = 2012, month = 1, day = 1)
SET FILEFORMAT SEQUENCEFILE;
//如果是分區表,需要使用PARTITION子句
ALTER TABLE <table>
SET SERDE 'com.example.JSONSerDe'
WITH SERDEPROPERTIES(
'prop1' = 'value1',
'prop2' = 'value2');
h.其他修改語句
//執行鉤子:表中存儲的文件在Hive之外被修改,觸發鉤子的執行
ATLER TABLE <table> TOUCH PARTITION();
//若表或分區不存在,鉤子執行不會創建表或者分區,需要其他策略
//將這個分區內的文件打包成一個Hadoop壓縮包(HAR)文件,僅僅降低了文件系統中的文件數以及減輕NameNode的壓力,不會減少任何存儲空間
ALTER TABLE <table> ARCHIVE PARTITION();//反向操作UNARCHIVE,只適用于表的獨立分區
//防止分區被刪除和被查詢,DISABLE反向操作
ALTER TABLE <table> PARTITION() ENABLE NO_DROP;
ALTER TABLE <table> PARTITION() ENABLE OFFLINE;
新聞熱點
疑難解答