DDL操做:增刪改數據庫表和數據庫(hive中ddl操做是能夠操做數據庫的)node
DML操做:增刪改數據數據庫
HIVE中特別的字段集合類型:數組
Strutc(first String,last String): 由first 和last 組成一個字段session
Map(key,value,key,value...):由key value 組成字段,須要指定哪一個是key 哪一個是valueapp
Array(value String,value String,value String):由平級的字段來組成 spa
安裝好hive後 (安裝hive 過程不詳述)輸入 hive 進入hive:rest
進入hive後默認進入default數據庫orm
use mydb;--使用本身建立的數據庫ip
set hive.cli.print.currend.db=true;設置hive命令後顯示數據庫名ci
HIVE數據庫相關操做
建立數據庫
create database if not exists mydb
location '/my/databases'--指定數據文件存放位置。 一般該位置是由hive.metastore.warehouse.dir 指定。也能夠臨時指定
comment 'my databases'--描述 個人數據庫
with dbproperties('creator' = 'pang','date' = '2015-4-15');--建立信息
查看數據庫列表
show databases in mydb; --也能夠show databases like 'my.*'展出 以my開頭的 .* 是匹配項。in mydb 是隻列出mybd下的表
查看數據庫信息
describe database extended mydb; --若不加extended 則只能看的到comment
刪除數據庫
drop database if exists financials cascade;刪除數據庫 cascade級聯刪除,若是數據庫裏面有表有數據須要經過級聯刪除才能刪掉。
修改數據庫
alter database mydb set dbproperties('edited-by','pang');--修改數據庫信息
HIVE表相關操做
建立外部表
creat external table mytable(name String,age int)--建立外部表,用處是除了hive外的程序部件也可使用外部表
建立表:
create table mytable(name String,age int,friends Array(String),deduction Map(String,float),address Strutc(street:String ,city:String,state:String,zip:int))
row format delimited--每一行之間用分隔符來替代
fields terminated by '\001'--域之間用 \001 來分割 即 ^A
collection items terminated by '\002'--數組之間元素用 \002 來分割 即 ^B
map keys terminated by '\003'--key 和 value之間用 \003 來分割 即 ^C
lines terminated by '\n'--行結束用回車
stored as textfile;--以textfile 格式來存儲這個數據文件.
這些特定字段分割都是缺省分隔。若是不指定建立語句下方的分隔規則,則使用該分隔規則。
複製建立新表
cteate table if not exists mydb.mytable1 like mytable;--使用mydb. 能夠指定數據庫
查看錶描述
describe extended mydb.mytable; --mydb.mytable.name這樣既可查看某個字段的描述
更改表名
alter table mytables rename to tables;
更改列名列類型
alter table mytable change columns hms hours_minutes_seconds int after severity;
添加列
alter table mytable add columns(
app_name String comment 'application name',
session_id long
)
hive不支持行級別的insert、delete、update。將數據放入表中的惟一辦法是 批量載入。
加載本地文件到表中對應的分區下
load data local inpath '${env:home}/california-employees' overwrite into table mytable partition(country='us')
從另一張表查詢出數據插入到表中
insert overwrite TABLE table partition (country='us') select * from mytables
建立表的同時插入數據
creat table mytable as select name,age from students where age='18'
修改某列信息
alter table mytable replace columns(
message String comment 'the rest of the message'
);
HIVE表分區
建立分區表
create table mytable(name String,age int,friends Array(String),deduction Map(String,float),address Strutc(street:String ,city:String,state:String,zip:int))
partitioned by(country String);--以國家爲分區。分區關鍵字不必定在表字段上體現。分區表的存儲會變成一個子目錄裏面的一系列文件
分區表查詢存在一個strict模式(嚴格模式)概念。
set hive.mapred.mode=strict;
select e.name,e.salary from mytable e limit 100; 會報錯
FAILED:ERRORin semantic analysis:No partition predicate found for alias "e" table "mytable"
set hive.mapred.mode=nonstrict; 則能夠查詢
可是:既然存在分區,則應該儘可能使用分區來查詢,不用條件亂查效率低下。
列出分區
show partitions mytable partition (country='us');列出美國分區下的表
增長分區
alter table mutables add if not exists
partition(year = 2015 ,mouth =4 ,day =1) location '2015/4/1'
partition(year = 2015 ,mouth =4 ,day =2) location '2015/4/2'
partition(year = 2015 ,mouth =4 ,day =3) location '2015/4/3'...;
能夠將一根非分區表按條件批量插入到分區表中
FROM mytable mt
insert overwrite TABLE table partition (country = 'us') select * where mt.cnty = 'us'
insert overwrite TABLE table partition (country = 'china') select * where mt.cnty = 'china'
insert overwrite TABLE table partition (country = 'japan') select * where mt.cnty = 'japan';
以上分區方法是否是太累贅?沒辦法hive就是這麼笨拙。不過也不是沒有辦法 :動態分區插入
hive> set hive.exec.dynamic.partition=true; 動態分區插入功能開啓
hive> set hive.exec.dynamic.partition.mode=nonstrict; 全部的分區均可以動態插入
hive> set hive.exec.max.dynamic.partitions.oernode=1000;某一個表最大分區數(可選設置)
而後使用動態分區插入語句:
hive>insert overwrite Table mytable
>partition(country)
>select ...,cty,st
>from table;
HIVE數據導出
hive的數據文件是明文文本,能夠直接拷貝導出。
若是須要改動數據格式,也可使用insert overwrite
insert overwrite local directory '/tmp/pang'
select name,salary,address from mytable where name like '%王%'
手動整理可能有打錯的單詞不要太認真!!hive更新較快語句持續更新!!