1. 程式人生 > >Hive程式設計指南-學習筆記(二) 資料定義

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可以達到反向操作的目的。