1. 程式人生 > 其它 >數倉工具—Hive表的基本操作(3)

數倉工具—Hive表的基本操作(3)

技術標籤:資料倉庫Hivehive

1. 建立表

create table語句遵從sql語法習慣,只不過Hive的語法更靈活。例如,可以定義表的資料檔案儲存位置,使用的儲存格式等。

簡單一點就是這樣的CREATE TABLE pokes (foo INT, bar STRING); 除了必要的資訊外,其他的都可以使用預設的資訊

分割槽表

create table if not exists test.user1(
name string comment 'name',
salary float comment 'salary',
address struct<country:string,
city:string> comment 'home address' ) comment 'description of the table' partitioned by (age int) row format delimited fields terminated by '\t' stored as orc;

沒有指定external關鍵字,則為管理表,跟mysql一樣,if not exists如果表存在則不做操作,否則則新建表。comment可以為其做註釋,分割槽列為age年齡,列之間分隔符是\t,儲存格式為列式儲存orc,儲存位置為預設位置,即引數hive.metastore.warehouse.dir

(預設:/user/hive/warehouse)指定的hdfs目錄。

分桶表

其實我們可以大致的將表分為,普通表、分割槽表、和分桶表,下面我們演示一下分桶表,至於分割槽表和分桶表之間的區別我們後面會單獨講,下面我們建立一個分桶表

CREATE TABLE par_table(
  viewTime INT,
  userid BIGINT,
  page_url STRING, referrer_url STRING,
  ip STRING COMMENT 'IP Address of the User'
)
COMMENT 'This is the page view table'
PARTITIONED BY
(date STRING, pos STRING) CLUSTERED BY(userid) SORTED BY(viewTime) INTO 32 BUCKETS ROW FORMAT DELIMITED ‘\t’ FIELDS TERMINATED BY '\n' STORED AS SEQUENCEFILE;

2. 拷貝表

使用like可以拷貝一張跟原表結構一樣的空表,裡面是沒有資料的

create table if not exists test.user2 like test.user1;

當然你也可以根據查詢出來的資料建立表

create table user_behavior_copy as select * from user_behavior limit 10;

3. 查看錶結構

通過desc [可選引數] tableName命令查看錶結構,可以看出拷貝的表test.user1與原表test.user1的表結構是一樣的。

hive> desc test.user2;
OK
name                	string              	name                
salary              	float               	salary              
address             	struct<country:string,city:string>	home address        
age                 	int                 	                    
	 	 
# Partition Information	 	 
# col_name            	data_type           	comment             
	 	 
age                 	int                 	                    

也可以加formatted,可以看到更加詳細和冗長的輸出資訊。

hive> desc formatted test.user2;
OK
# col_name            	data_type           	comment             
	 	 
name                	string              	name                
salary              	float               	salary              
address             	struct<country:string,city:string>	home address        
	 	 
# Partition Information	 	 
# col_name            	data_type           	comment             
	 	 
age                 	int                 	                    
	 	 
# Detailed Table Information	 	 
Database:           	test                	 
Owner:              	hdfs                	 
CreateTime:         	Mon Dec 21 16:37:57 CST 2020	 
LastAccessTime:     	UNKNOWN             	 
Retention:          	0                   	 
Location:           	hdfs://nameservice2/user/hive/warehouse/test.db/user2	 
Table Type:         	MANAGED_TABLE       	 
Table Parameters:	 	 
	COLUMN_STATS_ACCURATE	{\"BASIC_STATS\":\"true\"}
	numFiles            	0                   
	numPartitions       	0                   
	numRows             	0                   
	rawDataSize         	0                   
	totalSize           	0                   
	transient_lastDdlTime	1608539877          
	 	 
# Storage Information	 	 
SerDe Library:      	org.apache.hadoop.hive.ql.io.orc.OrcSerde	 
InputFormat:        	org.apache.hadoop.hive.ql.io.orc.OrcInputFormat	 
OutputFormat:       	org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat	 
Compressed:         	No                  	 
Num Buckets:        	-1                  	 
Bucket Columns:     	[]                  	 
Sort Columns:       	[]                  	 
Storage Desc Params:	 	 
	field.delim         	\t                  
	serialization.format	\t                  

4. 刪除表

這跟sql中刪除命令drop table是一樣的:

drop table if exists table_name;

對於管理表(內部表),直接把表徹底刪除了;對於外部表,還需要刪除對應的hdfs檔案才會徹底將這張表刪除掉,為了安全,通常hadoop叢集是開啟回收站功能的,刪除外表表的資料就在回收站,後面如果想恢復也是可以恢復的,直接從回收站mvhive對應目錄即可。

5. 修改表

大多數表屬性可以通過alter table來修改。

5.1 表重新命名

alter table test.user1 rename to test.user3;

5.2 增、修、刪分割槽

增加分割槽使用命令alter table table_name add partition(...) location hdfs_path

alter table test.user2 add if not exists
partition (age = 101) location '/user/hive/warehouse/test.db/user2/part-0000101'
partition (age = 102) location '/user/hive/warehouse/test.db/user2/part-0000102'

修改分割槽也是使用alter table ... set ...命令

alter table test.user2 partition (age = 101) set location '/user/hive/warehouse/test.db/user2/part-0000110'

刪除分割槽命令格式是alter table tableName drop if exists partition(...)

alter table test.user2 drop if exists partition(age = 101)

5.3 修改列資訊

可以對某個欄位進行重新命名,並修改位置、型別或者註釋:

修改前:

hive> desc user_log;
OK
userid              	string              	                    
time                	string              	                    
url                 	string              	                    

修改列名timetimes,並且使用after把位置放到url之後,本來是在之前的。

alter table test.user_log
change column time times string
comment 'salaries'
after url;

再來看錶結構:

hive> desc user_log;
OK
userid              	string              	                    
url                 	string              	                    
times               	string              	salaries            

time -> times,位置在url之後。

5.4 增加列

hive也是可以新增列的:

alter table test.user2 add columns (
birth date comment '生日',
hobby string comment '愛好'
);

5.5 刪除列

刪除列不是指定列刪除,需要把原有所有列寫一遍,要刪除的列排除掉即可:

hive> desc test.user3;
OK
name                	string              	name                
salary              	float               	salary              
address             	struct<country:string,city:string>	home address        
age                 	int                 	                    
	 	 
# Partition Information	 	 
# col_name            	data_type           	comment             
	 	 
age                 	int                 	                    

如果要刪除列salary,只需要這樣寫:

alter table test.user3 replace columns(
name string,
address struct<country:string,city:string>
);

這裡會報錯:

FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Replacing columns cannot drop columns for table test.user3. SerDe may be incompatible

這張test.user3表是orc格式的,不支援刪除,如果是textfile格式,上面這種replace寫法是可以刪除列的。通常情況下不會輕易去刪除列的,增加列倒是常見。

5.6 修改表的屬性

可以增加附加的表屬性,或者修改屬性,但是無法刪除屬性:

alter table tableName set tblproperties(
    'key' = 'value'
);

舉例:這裡新建一張表:

create table t8(time string,country string,province string,city string)
row format delimited fields terminated by '#' 
lines terminated by '\n' 
stored as textfile;

這條語句將t8表中的欄位分隔符’#‘修改成’\t’;

alter table t8 set serdepropertyes('field.delim'='\t');

6 其他操作

6.1. 查看錶

檢視當前資料庫下的全部標

show tables

檢視特定庫下的全部表

 show tables in ods;

按正條件(正則表示式)顯示錶

 SHOW TABLES '.*s';

6.2 load 資料

這個一般用於我們載入一下其他地方的資料到hive 表中,例如外部的文字資料、或者是埋點資料

create table ods.user_info (
    user_id int,
    cid string,
    ckid string,
    username string)
    row format delimited
    fields terminated by '\t'
    lines terminated by '\n';

匯入本地資料

load data local inpath '/Users/liuwenqiang/workspace/hive/user.txt' overwrite into table ods.user_info

下面是資料,匯入資料表的資料格式是:欄位之間是tab鍵分割,行之間是換行。

100636	100890	c5c86f4cddc15eb7	王1
100612	100865	97cc70d411c18b6f	王2
100078	100087	ecd6026a15ffddf5	王

匯入HDFS資料

去掉local 關鍵字就可以了,但是注意匯入HDFS 上的資料是move 操作,而本地是copy 操作

load data inpath '/Users/liuwenqiang/workspace/hive/user.txt' overwrite into table ods.user_info

其實很多時候你不用load 命令也可以,只要你將準備好的資料放到對應的表目錄下就可以了,對於本地檔案可以使用 hdfd dfs -put 對於叢集上的檔案使用hdfs dfs -mv