HiveQL操作簡要 數據庫和表的相關

--01建數據庫
CREATE DATABASE IF NOT EXISTS DATABASE_NAME;
--02查詢數據庫
SHOW DATABASE;
SHOW DATABASE LIKE 'h.*'--Hive 並非支持所有的正則表達式功能
--03 修改數據庫默認位置
CREATE DATABASE DATABASE_NAME LOCATION '/my/preferred/directory';
--04 查詢數據庫默認位置
describe DATABASE DATABASE_NAME;
--05 使用數據庫
USE DATABASE_NAME;
--06 顯示數據庫名稱
SET hive.cli.print.current.db=ture;
--07 關閉顯示數據庫名稱
SET hive.cli.print.current.db=false;
--08 刪除數據庫
DROP DATABASE IF EXIT DATABASE_NAME;
默認情況下,hive 不允許刪除一個包含有表的數據庫,用戶需要刪除庫中 的表,然後刪除數據庫;或者在刪除表命令後加上關鍵字CASCADE,這樣可以使hive自行刪除該庫中的表。
DROP DATABASE IF EXIT DATABASE_NAME CASCADE;
--09 刪除數據庫表
USE DATABASE_NAME;
DROP TABLE DATABASE_NAME;
--10 修改數據庫
用戶可以適用ALTER DATABASE 命令爲某個數據庫的 DBPROPERTIES 設置鍵-值對屬性值,來描述這個數據庫的屬性信息。數據庫的其他元數據信息都是不可更改的,包括數據庫名
和數據庫坐在的目錄位置:
 ALTER DATABASE DATABASE_NAME SET DBPROPERTIES('edited-by','joe dba' );
刪除或者充值數據庫的信息是沒有辦法的。
--11 創建表
use ODS_CDH;
drop table if exists CDH_PRODUCT_ZLJ_TEST;
create table CDH_PRODUCT_ZLJ_TEST
(
  PRO_ID          string,
  PRODUCT_NAME    string,
  PRODUCT_NAME_TW string,
  PRODUCT_NAME_US string,
  SHOW_FLAG       INT,
  EDIT_FLAG       INT,
  SHOW_SORT       INT,
  PRODUCT_TYPE_ID int,
  QUERY_FLAG      INT,
  EXPORT_FLAG     INT
)comment 'CDH_PRODUCT_ZLJ_TEST oracle 到 hive 全量'
row format delimited fields terminated by '\001'
location '/ods/cdh/cbsdb/cdh_product_zlj_test';
--12 查詢表 數據
SELECT * FROM CDH_PRODUCT_ZLJ_TEST;
--13 查詢表結構
describe extended schema.DATABASE_NAME;
--14 查看字段信息
describe extended schema.DATABASE_NAME.cloumn_name;
--15 管理表與外部表
建表的時候如果是 帶有 EXTERNAL 就是外部表,否則就是內部表。
CREATE EXTERNAL TABLE IF NOT EXISTS STOCKS (
EXCHANGE  STRING,
SYMBOL    STRING,
YMD       STRING,
PRICE_OPEN FLOAT,
PRICE_HIGH FLOAT,
PRICE_LOW  FLOAT,
PRICE_CLOSE FLOAT,
VOLUME      INT,
PRICE_ADJ_CLOSE FLOAT
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION '/DATA/STOCKS';


用describe extended table_name;  Detailed Table Information 的最後可以看到  
tableType:MANAGED_TABLE (管理表)
或者  tableType:EXTERNAL_TABLE(外部表);
--16 複製表結構不復制數據
CREATE EXTERNAL TABLE IF NOT EXISTS schema.tablename
LIKE mydb.employees
LOCATION '/path/to/data';
--17 分區表
用國家,省兩個字段來對僱員進行分區建表
CREATE TABLE employees(
NAME STRING,
salary FLOAT,
subordinates ARRAY<STRING>,
deducations MAP<STRING,FLOAT>,
address struct<street:STRING,city:STRING,state:STRING,zip:INT>
)
PARTITION BY (country STRING,state STRING);--分區列列並沒真正存儲列,也就是不存於你的數據中。


--18 顯示錶的所有分區
SHOW PARTITIONS employees;
--19 查指定分區
SHOW PARTITIONS employees(country='US');
Detailed table employees; 也可以看到employees 信息。
--20 外部表分區 
CREATE EXTERNAL TABLE IF NOT EXISTS log_message(
hms INT,
severity STRING,
server STRING,
process_id INT,
message STRING
)PARTITION BY (YEAR INT,MONTH INT ,DAY INT)
ROW format delimted fields terminated BY '/t';
--21 加分區

ALTER TABLE log_message ADD PARTITION (YEAR = 2012,MONTH = 1 ,DAY = 1) LOCATION 'hdfs://master_server/data/log_message/2012/01/02';


--22 將分區下的數據拷貝到 Amazon S3 廉價的存儲設備中 

hadoop distcp /DATA/log_message/2011/12/02 s3n: //ourbucket/logs/2011/12/02


--23 修改表,將分區路徑指向到S3 路徑

ALTER TABLE log_message ADD PARTITION (YEAR = 2011,MONTH = 12 ,DAY = 2) SET LOCATION 's3n://ourbucket/logs/2011/01/02';


--24 使用Hadoop fs -rmr 命令刪除掉HDFS 中的這個分區的數據:

Hadoop fs -rmr /DATA/log_message/2011/12/02


--25 查看分區路徑 
describe Extended log_message; 

describe Extended log_message partition(YEAR = 2012,MONTH = 1 ,DAY = 1); 


--26 建表自定義表的存儲格式
CREATE TABLE employees(
NAME STRING,
salary FLOAT,
subordinates ARRAY<STRING>,
deducations MAP<STRING,FLOAT>,
address struct<street:STRING,city:STRING,state:STRING,zip:INT>
)
ROW format delimited
fileds terminated BY '\001'
collection items terminated BY '\002'
MAP keys terminated BY '\003'
lines terminated BY '\n'

STORED AS textfile;--26 建表自定義表的存儲格式 顯示指定


--27 其他建表
用戶可以指定第三方的輸入以及serde。
還有一些額外 建表子句:


--28 刪除表

DROP TABLE IF EXIT employees;


--29 表重命名

ALTER TABLE employees RENAME TO new_name;


--30 刪除分區

ALTER TABLE employees DROP IF EXISTS PARTITION (YEAR = 2012,MONTH = 1 ,DAY = 1);


--31 修改列信息
--修改列的名字並改變列的位置 
--上面的語句作用是,修改hms列的名字爲hours_minutes_seconds,並把它放在severity列之後。
ALTER TABLE log_messages
CHANGE COLUMN hms hours_minutes_seconds INT
COMMENT 'Thehours, minutes, and seconds part of the timestamp'

AFTER severity;


--32 增加列信息
--添加列
ALTER TABLE log_messages ADD COLUMNS (
app_name  STRING COMMENT 'Application name',

session_id STRING  COMMENT 'The current sessionid');


--33 刪除或替換列信息
--替換列
ALTER TABLE log_messages REPLACE COLUMNS (
hours_mins_secs INT  COMMENT 'hour, minute, seconds fromtimestamp',
severity  STRING COMMENT 'The message severity'
message  STRING COMMENT 'The rest of the message');
 
上面的語句是重命名原來的hms列爲hours_mins_secs,刪除掉原來的server和process_id列。

但注意REPLACE語句只有在本地的SerDe 模式的表上使用,後面的章節會提到。


--34 修改表屬性
--修改表的屬性測試報錯
ALTER TABLE log_messages SET TBLPROPERTIES

('notes' = 'The process idis no longer captured; this column is always NULL');


--35 修改存儲屬性
--修改存儲屬性
ALTER TABLE log_messages
PARTITION(year =2011, month = 1, day = 1)
SET FILEFORMAT SEQUENCEFILE;
 
ALTER TABLE stocks
CLUSTERED BY(exchange, symbol)
SORTED BY(symbol)

INTO 48 BUCKETS;


--36 其他修改表語句
--鉤回語句
ALTER TABLE log_messages TOUCH
PARTITION (year =2012, month = 1, day = 1);
 
執行上面的語句後,當hive的外部文件被修改時,會觸發一個鉤回操作
 
--歸檔分區語句
ALTER TABLE log_messages ARCHIVE
PARTITION(year =2012, month = 1, day = 1);
 
歸檔分區僅是減少文件系統文件的數量,減少namenode的壓力,不會減少空間使用。反操作語句是NOARCHIVE
 
--保護分區不會被刪除
ALTER TABLE log_messages
PARTITION(year =2012, month = 1, day = 1) ENABLE NO_DROP;
 
hive (mydb)>ALTER TABLE logmsgs
           > PARTITION(year = 2014, month =1, day = 21) ENABLE NO_DROP;
hive (mydb)>ALTER TABLE logmsgs DROP IF EXISTS PARTITION(year = 2014, month = 1, day = 21);
FAILED:SemanticException [Error 30011]: Partition protected from being droppedmydb@logmsgs@year=2014/month=1/day=21
hive (mydb)>ALTER TABLE logmsgs
           > PARTITION(year = 2014, month =1, day = 21) disABLE NO_DROP;
OK
Time taken: 0.25seconds
hive (mydb)>ALTER TABLE logmsgs DROP IF EXISTS PARTITION(year = 2014, month = 1, day = 21);
Dropping thepartition year=2014/month=1/day=21
OK
Time taken:0.429 seconds
hive (mydb)>show partitions logmsgs;
OK
year=2014/month=1/day=20
year=2014/month=1/day=22
Time taken:0.105 seconds, Fetched: 2 row(s)
 
--保護分區不能被查詢
ALTER TABLE log_messages
PARTITION(year =2012, month = 1, day = 1) ENABLE OFFLINE;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章