hive基礎語法一
set $屬性(變量);
with tmp as();
select
from(
select
a.id id,
a.name name
from test
left join test1 b
on ....
join ...
where
group by
having
order by / sort by
union /union all
)
語法規則:
hive的數據庫名、表名都不區分大小寫
命名規則:
不能使用關鍵字、數字開頭的字符串來作庫表名。
儘量不使用特殊符號
默認數據庫
hive有一個默認的數據庫default,如果不明確的說明要使用哪個庫,則使用默認數據庫。
test.a1屬於 test_a1
創建庫的本質是:、在hive的工作空間(warehouse)目錄下創建一個,庫名.db的目錄
表下分區:分區下有桶
表下有桶:
表下數據
創建表:本質也是創建目錄:
create table
建表語法
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] TABLENAME
[COLUMNNAME COLUMNTYPE [COMMENT 'COLUMN COMMENT'],...]
[COMMENT 'TABLE COMMENT']
[PARTITIONED BY (COLUMNNAME COLUMNTYPE [COMMENT 'COLUMN COMMENT'],...)]
[CLUSTERED BY (COLUMNNAME COLUMNTYPE [COMMENT 'COLUMN COMMENT'],...) [SORTED BY (COLUMNNAME [ASC|DESC])...] INTO NUM_BUCKETS BUCKETS]
[ROW FORMAT ROW_FORMAT]
[STORED AS FILEFORMAT]
[LOCATION HDFS_PATH];
hive 默認的字段分隔符:
爲ascii碼的控制符\001,建表的時候用fields terminated by '\001',如果要測試的話,造數據在vi 打開文件裏面,用ctrl+v然後再ctrl+a可以輸入這個控制符\001。按順序,\002的輸入方式爲ctrl+v,ctrl+b。以此類推。^A /001 /u001 同理:^B /002 /u002
設置分割:
row format delimited fields terminated by ','
lines terminated by '\n'
內外表的區別:
1、內部表 表目錄會創建在hdfs的/user/hive/warehouse/下的相應的庫對應的目錄中。
將表四加到表一的工作目錄下(內部表)未在hive的工作目錄創建目錄
2、外部表 外部表會根據創建表時LOCATION指定的路徑來創建目錄,如果沒有指定LOCATION,則位置跟內部表相同
內部表和外部表在創建時的差別:就差兩個關鍵字,EXTERNAL LOCATION
舉例:
內部表 -- CRAATE TABLE T_INNER(ID INT);
外部表 -- CREATE EXTERNAL TABLE T_OUTER(ID INT) LOCATION 'HDFS:///AA/BB/XX';
1.默認創建內部表,創建外部表需要external。
2.一般使用外部表(長期存在的表,數據量大的、不希望把數據塊刪除的數據),臨時表或者確定使用即可清空全部數據(數據塊和元數據)則可使用內部表
3.內部表刪除時將會刪除元數據和Hdfs中表對應的目錄,而外部表刪除是隻會刪除元數據 ,hdfs中的數據目錄保留。
create EXTERNAL table if not exists t_user2(id string,name string)
4.創建表
創建外部表時如果加了location那麼會在location指定的目錄下
創建表(不會創建表目錄),(hive工作目錄不顯示,指定目錄下也不顯示)
location加載hdfs中的目錄:
如果不指定location,使用load會將(hdfs中數據)數據拉過去。到hive的工作空間下。(此表刪除時,hive工作空間下目錄不會刪除,即元數據刪除,數據文件在hive工作目錄裏)
load加載時hdfs中的數據(文件)。
create external table t_user2
ods層:把原數據抽取:(表目錄)sqoop
DW層:數倉層(抽取數據從ods中)sql
DM層:即視層
hive的本地運行(集羣開啓時)
set hive.exec.mode.local.auto=true;
hive的表加載
加載數據的本質:
1、如果數據在本地,加載數據的本質就是將數據copy到hdfs上的表目錄下。
2、如果數據在hdfs上,加載數據的本質是將數據移動到hdfs的表目錄下。
load data local inpath '/hivedata/user.txt' into table t2;
hive使用的是嚴格的讀時模式:加載數據時不檢查數據的完整性,讀時發現數據不對則使用NULL來代替。
而mysql使用的是寫時模式:
1.直接將hdfs中的數據使用命令上傳到表所對應的目錄
2.創建表的時候,使用location指定表所對應的目錄即可
create EXTERNAL table t_user3(id string,name string)
> row format delimited fields terminated by ' '
> lines terminated by '\n'
> location '/user/hive/warehouse/qf_bjdata.db/t_user1';
將表三加到表一的工作目錄下(外部表(外部表的性質,刪除表三,數據仍在,表一的元數據依舊在))
create table t_user4(id string,name string)
> row format delimited fields terminated by ' '
> lines terminated by '\n'
> location '/user/hive/warehouse/qf_bjdata.db/t_user1';
將表四加到表一的工作目錄下(內部表(刪除表四,及表一的工作目錄被刪除)表一仍在(數據被刪))
3.使用load方式加載數據(默認,和覆蓋寫,移動)
load data inpath '/neibu' into table t_user1;--移動--
load data local inpath '/hive/data/neibu.txt' into table t_user1;--複製
load data local inpath '/hive/data/neibu.txt' overwrite into table t_user1 --重寫複製
4.使用 insert into 方式
法一:
insert into table t_user2
select id ,name from t_user;
法二:
from t_user
insert into table t_user2
insert into table t_user3
select id,name
法三
with tmp as(
select
id,
name
from t_user
)
insert into table t_user2
select * from tmp;
5、使用ctas方式來
create table t_user3
as
select
id,name
from t_user;
6、使用like(克隆)
create table t_user4 like t_user2;(複製結構)
create table t_user5 like t_user2 location ‘目錄’;(複製結構和數據)
注:1/2/4方法常用
查看錶的描述:
desc t_user2
desc extended t_user2;
show create table t_user2; --和mysql一樣
desc t_user2;
表屬性修改:
表名:
alter table log rename log2 (改變tbl;元數據的映射(元數據在hdfs的地址(sds)沒變))
字段名:
alter table log2 change column id myid int after mac;
注:沒有before和last
字段類型:
字段順序:
添加字段:
alter table log2 add columns(dt1 int,dt2 string);
刪除字段:
alter table log2 replace columns(dt1 int,dt2 string)//替換,保留()裏的字段
內外部錶轉換:
alter table log3 set tblproperties('EXTERNAL=TRUE');####內部錶轉外部表(大寫)
alter table log3 set tblproperties('EXTERNAL=false');####外部錶轉內部表(忽略大小寫)
顯示當前庫:
set hive.cli.print.current.db=true
刪除庫:
drop database qf24;
drop database qf24 cascade;