Hive程式設計指南-學習筆記(二) 資料定義
一、資料庫
1、建立資料庫:CREATE DATABASE hive;
如果已經存在,會丟擲異常,下面的語句不丟擲異常:CREATE DATABASE IF NOT EXISTS hive;
資料庫的預設位置是hdfs上:/user/hive/warehouse,修改預設位置:CREATE DATABASE financial LOCATION '/my/preferred';(訪問目錄:/usr/local/hadoop/bin/hdfs dfs -ls hdfs://localhost:9000/user/hive/warehouse)
為資料庫新增描述資訊:CREATE DATABASE financial COMMENT 'Holds all financial tables';
新增鍵值對屬性資訊:CREATE DATABASE financials WITH DBPROPERTIES('creator'='zj','date'='2018-10-05');(檢視資訊:)DESCRIBE DATABASE EXTENDED financials;
2、刪除資料庫:DROP DATABASE abc;
DROP DATABASE IF EXISTS abc;
預設情況下,Hive不允許刪除一個包含有表的資料庫:(1)方法一:先刪除資料庫中的表;(2)方法二:DROP DATABASE IF EXISTS abc CASCADE;
3、修改資料庫
資料庫名和所在的目錄位置是不可更改的。
修改鍵值對屬性資訊:ALTER DATABASE financials SET DBPROPERTIES('edited-by'='jz');
4、檢視全部資料庫:SHOW DATABASES;
如果資料庫非常多,可以使用正則表示式匹配來篩選出需要的資料庫名:
檢視所有以h開頭的資料庫:SHOW DATABASES LIKE 'h.*';
檢視某個資料庫的資訊:DESCRIBE DATABASE financials;
5、將某個資料庫設定為當前工作資料庫:USE financials;
6、設定顯示當前所在的資料庫:set hive.cli.print.current.db=true;
二、表
1、建立表
CREATE TABLE IF NOT EXISTS usr(
id BIGINT,
name STRING,
age INT)
LOCATION '/usr/local/hive/warehouse/hive/usr'; #指定儲存路徑
CREATE TABLE IF NOT EXISTS mydb.employees( #如果當前所處位置並非是目標資料庫,加‘mydb.’,指定資料庫
name STRING COMMENT 'Employee name', #為每個欄位添加註釋
salary FLOAT COMMENT 'Employee salary',
subordinates ARRAY<STRING> COMMENT 'Name 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 of address')
COMMENT 'Description of the table' #為表本身添加註釋
TBLPROPERTIES ('creator'='me','created_at'='2018-10-05') #按鍵-值對的格式為表新增額外的文件說明
LOCATION '/user/hive/warehouse/mydb.db/employees'; #指定儲存路徑
拷貝一張已經存在的表的模式(不拷貝資料):
CREATE TABLE IF NOT EXISTS mydb.employees2 LIKE mydb.employees;
還可以接受可選的LOCATION語句,但是其他的屬性都不可以重新定義。
2、刪除表
DROP TABLE employees;
DROP TABLE IF EXISTS employees;
對於管理表,表的元資料資訊和表內的資料都會被刪除。
對於外部表,表的元資料資訊會被刪除,但是表中的資料不會被刪除。
3、顯示當前資料庫下的所有表:SHOW TABLES;
如果當前位置不在mydb資料庫下:SHOW TABLES IN mydb;
顯示empl開頭的表:SHOW TABLES 'empl.*';(與IN database_name語句不可同時使用)
檢視某個表的資訊:DESCRIBE usr;
檢視某個表的詳細資訊(顯示出分割槽鍵):DESCRIBE EXTENDED usr;
檢視某個表的可讀的、更詳細的資訊:DESCRIBE FROMATTED usr;
查看錶中某一個列的資訊:DESCRIBE usr.id;
查看錶的TBLPROPERTIES屬性資訊:SHOW TBLPROPERTIES usr;
4、內部表(管理表):管理表不方便和其他工作共享資料,刪除時會同時刪除元資料和資料;
外部表:刪除不會刪除資料,表的元資料會被刪除掉。
建立外部表:
CREATE EXTERNAL TABLE IF NOT EXISTS stocks( #關鍵字EXTERNAL表明是外部表
exchage STRING,
symbol STRING,
ymd STRING,
price_open FLOAT)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
LOCATION '/data/stocks';
使用者可以在DESCRIBE EXTENDED tablename語句的輸出末尾,查看錶是管理表還是外部表。
對於管理表,可以通過表結構複製到一個外部表:(如果省略EXTERNAL,新表也是管理表)
CREATE EXTERNAL TABLE IF NOT EXISTS mydb.employees2
LIKE mydb.employees
LOCATION '/path/to/data'; #LOCATION子句可選
5、分割槽(管理)表:
CREATE TABLE employees(
name STRING,
salary FLOAT,
subordinates ARRAY<STRING>,
deductions MAP<STRING,FLOAT>,
address STRUCT<street:STRING,city:STRING,state:STRING,zip:INT>)
PARTITIONED BY (country STRING,state STRING); #先按照country,再按照state對資料進行分割槽
分割槽表改變了Hive對資料儲存的組織方式,為了提高查詢效能。
非分割槽表的目錄:hdfs://master_server/user/hive/warehouse/mydb.db/employees
分割槽表的目錄:.../employees/country=CA/state=AB
.../employees/country=CA/state=BC
……
當在WHERE子句中按照分割槽值進行過濾時,這些分割槽值稱為分割槽過濾器。如果對分割槽表進行查詢,且WHERE子句中沒有加分割槽過濾,會是一個巨大的MapReduce任務:
禁止任務執行:set hive.mapred.mode=strict;
准許任務執行:set hive.mapred.mode=nonstrict;
--同樣適用於外部分割槽表
查看錶中存在的所有分割槽:SHOW PARTITIONS employees;
查看錶中的特定分割槽:SHOW PARTITIONS employees PARTITION(country='US');
SHOW PARTITIONS employees PARTITION(country='US',state='AK');
檢視分割槽資料所在的路徑:DESCRIBE EXTENDED log_messages PARTITION (year=2012,month=1,day=2);
在管理表中可以通過載入資料的方式建立分割槽:
LOAD DATA LOCAL INPATH '${env:HOME}/california-employees' # ${env:HOME}表示HOME環境變數
INTO TABLE employees
PARTITION (country='US',state='CA');
6、外部分割槽表
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';
增加一個2012年1月2日的分割槽(同樣適用於分割槽管理表):
ALTER TABLE log_messages ADD PARTITION(year=2012,month=1,day=2)
LOCATION 'hdfs://master_server/data/log_messages/2012/01/02'; #分層目錄結構,並非一定如此
7、修改表
ALTER TABLE僅僅會修改表元資料,表資料本身不會有任何修改。
(1)重新命名
ALTER TABLE log_messages RENAME TO logmsgs;
(2)增加、修改和刪除表分割槽
增加分割槽:
ALTER TABLE log_messages ADD IF NOT EXISTS #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'
...;
修改分割槽:
ALTER TABLE log_messages PARTITION(year=2011,month=12,day=2)
SET LOCATION 's3n://ourbucket/logs/2011/01/02'; #修改分割槽的路徑。不會刪除舊的資料
刪除分割槽:
ALTER TABLE log_messages DROP IF EXISTS PARTITION(year=2011,month=12,day=2); #IF EXISTS可選
(3)修改列資訊
ALTER TABLE log_messages
CHANGE COLUMN hms hours_minutes_seconds INT #必須完全指定舊欄位名、新欄位名和型別
COMMENT 'THE hours,minutes,and seconds part of timestamp'
AFTER severity; #若移到第一個位置,改成FIRST
(4)增加列
ALTER TABLE log_messages ADD COLUMNS(
app_name STRING COMMENT 'Application name');
(5)刪除或者替換列
ALTER TABLE log_messages REPLACE COLUMNS(
hours_mins_secs INT COMMENT 'hour,minute,seconds',
severity STRING COMMENT 'the measge severity');
(6)修改表屬性
ALTER TABLE log_messages SET TBLPROPERTIES(
'notes'='The process id is no longer captured'); #可以增加或修改屬性,無法刪除屬性
(7)修改儲存屬性
ALTER TABLE log_messages
PARTITION(year=2012,month=1,day=1)
SET FILEFORMAT SEQUENCEFILE; #將一個分割槽的儲存格式修改成SEQUENCE FILE
(8)分割槽保護
防止分割槽被刪除:
ALTER TABLE log_messages
PARTITION(year=2012,month=1,day=1) ENABLE NO_DROP;
防止分割槽被查詢:
ALTER TABLE log_messages
PARTITION(year=2012,month=1,day=1) ENABLE OFFLINE;
使用ENABLE替換DISABLE可以達到反向操作的目的。