hive基礎語法一

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;
發佈了44 篇原創文章 · 獲贊 6 · 訪問量 2030
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章