一、建立表node
create table if not exists mydb.employees{編程
name String COMMENT 'Employee name',session
salary FLOAT COMMENT 'Empolyee salary',app
subordinates APPAY<STRING> COMMENT 'Names of subordinates',tcp
deductions MAP<STRING,FLOAT>分佈式
COMMENT 'Keys are deductions names,values are percentages'oop
address STRUCT<street:STRING,city:String,state:STRING,zip:INT>rest
COMMENT 'Home address')server
COMMENT 'Desription of the table'ip
TBLPROPERITES ('creator '='me','created_at'='2012-01-02 10:00:00',...)
LOCATION '/usr/hive/warehouse/mydb.db/employees';
Hive 會自動添加兩個表屬性:一個是last_modified_by,其保存着最後修改這個表的用戶的用戶名。另外一個是last_modified_time,其保存着最後修改的新紀元時間秒。
二、查看錶的詳細表結構信息
DESCRIBE EXTENDED mydb.employees;
//在表名後添加字段的名稱,使用extended關鍵字也不會增長更多的輸出信息。
DESCRIBE mydb.employees.salary;
三、外部表
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';
關鍵字EXTENAL告訴hive這個表是外部的,然後面的LOCATION..子句則用於告訴HIVE數據位於哪一個路徑下。
//還能夠對一張存在的表進行結構複製(而不會複製數據)
CREATE EXTERNAL TABLE IF NOT EXISTS mydb.employees3
LIKE mydb.employees
LOCATION '/path/to/data';
四、分區表、管理表
CREATE TABLE employees (
name String,
salay FLOAT,
subordinates APPAY<STRING>,
deductions MAP<STRING,FLOAT>,
address STRUCT<street:STRING,city:STRING,state:STRING,zip:INT>
)
PARTITIONED BY (country STRING,state STRING);
分區表改變了Hive對數據存儲的組織方式,這個表會有一個exployees目錄與之對應,每一個分區都有一個partXX
//可使用show partitions命令查看錶中存在的全部分區:
SHOW PARTITIONS employees;
//若是表中存在不少的分區,而只想查看是否存儲某個特定分區鍵的分區的話,還能夠在命令上添加指定了一個或多個特定分區字段值的PARTITION子句:
SHOW PARTITIONS employees PARTITION(country='US');
SHOW PARTITIONS employees PARTITION(country='US',state='AK');
五、外部分區表
CREATE EXTERNAL TABLE IF NOT EXISTS log_messages (
hms INT,
severity STRING,
server STRING,
porcess_id STRING,
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 )
LOCATITION 'hdfs://master_server/data/log_message/2012/01/02';
//將一個月前的分區數據拷貝到其餘集羣
hadoop distcp /data/log_message/2011/12/02 s3n://ourbucket/logs/2011/12/02
//修改表,將分區路徑指向到S3路徑:
ALTER TABLE log_messages PARTITION(year = 2011,month = 12,day = 2)
SET LOCATION 's3m://ourbucket/logs/2011/01/02';
//DESCRIBE EXTENDED log_message 語句會將分區鍵做爲表的模式的一部分,和partitionKeys列表的內容同時進行顯示:
DESCRIBE EXTENDED log_messages;
六、刪除表
DROP TABLE IF EXISTS employees;
//這裏有個知識點,若是開啓了Hadoop回收站功能(默認是關閉),那麼數據將會轉移到用戶在分佈式文件系統中的用戶跟目錄下的.Trash目錄下,也就是HDFS中的/usr/$USER/.Trash目錄,若是要開啓這個功能,須要配置fs.trash.internal的值。設置一個合理的整數,好比若是設置1440,那麼就表示是24小時。
七、表重命名
ALTER TABLE log_messages RENAME TO logmsgs;
八、修改列信息
ALTER TABLE log_messages
CHANGE COLUMN hms hours_minutes_seconds INT
COMMENT 'The hours,minutes, and seconds part of the timestamp'
AFTER severity;
//這裏說明,若是想將這個字段移動到第一個位置,須要使用FIRST關鍵字替代AFTER other_column子句便可。
九、增長列
ALTER TABLE log_messages ADD COLUMNS (
app_name STRING COMMENT 'Application name',
session_id LONG COMMENT 'The current session id');
十、刪除或者替換列
//移除了以前全部的字段並從新指定了新的字段:
ALTER TABLE log_messages REPLACE COLUMNS (
hours_mins_secs INT COMMENT 'hour,minute,seconds from timestamp',
serverity STRING COMMENT 'The message severity'
message STRING COMMENT 'The rest of the message');
十一、修改存儲屬性
ALTER TABLE log_messages
PARTITION(year = 2012,month = 1,day = 1)
SET FILEFORMAT SEQUENCEFILE;
十二、經過查詢語句向表中插入數據
INSERT OVERWRITE TABLE employees
PARTITION (country = 'US' , state = 'OR' )
SELECT * FROM staged_employees se
WHERE se.cnty = 'US' AND se.st = 'OR';
//若是是非分區表,以前表中的內容將會被覆蓋掉
1三、動態分區插入
//指定了country字段的值爲靜態的US,而分區字段state是動態值。
INSERT OVERWRITE TABLE employees
PARTITION (country='US',state)
SELECT ...,se.cnty,se.st
FROM staged_employees se
WHERE se.cnty = 'US';
(靜態分區鍵必須出如今動態分區鍵以前)
//延伸動態分區屬性:
hive.exec.dynamic.partition false 設置成true,表示開啓動態分區功能
hive.exec.dynamic.partition.mode strict 設置成strict,表示容許全部分區都是動態的
hive.exec.max.dynamic.parition.pernode 100 每一個mapper或reducer能夠建立的最大動態分區個數。若是某個mapper或reducer嘗試建立大於這個值得分區的話則會拋出一個致命錯誤信息。
hive.exec.max.dynamic.partitions +1000 一個動態分區建立語句能夠建立的最大動態分區個數。若是超過這個值則會拋出一個致命錯誤信息。
hive.exec.max.created.files 100000 全局能夠建立的最大文件個數。
eg:
set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrct;
set.hive.exec.max.dynamic.partitions.pernode=1000;
INSERT OVERWRITE TABLE employees
PARTITION (country,state)
SELECT ...,se.cty,se.st
FROM staged_employees se;
1四、單個查詢語句中建立表並加載數據
CREATE TABLE ca_employees
as SELECT name,salary,address
FROM employees
WHERE se.state = 'CA';
1五、導出數據
hadoop fs -cp sorce_path target_path
//也可使用INSERT...DIRECTORY...
INSERT OVERWRITE LOCAL DIRECTOR 'tmp/ca_employees'
SELECT name,salary,address
From employees
WHERE se.state = 'CA';
參考文獻《Hive編程指南》