1. 建立表
create table
語句遵從sql
語法習慣,只不過Hive
的語法更靈活。例如,可以定義表的資料檔案儲存位置,使用的儲存格式等。
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
目錄。
2. 拷貝表
使用like
可以拷貝一張跟原表結構一樣的空表,裡面是沒有資料的。
create table if not exists test.user2 like test.user1;
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
叢集是開啟回收站功能的,刪除外表表的資料就在回收站,後面如果想恢復也是可以恢復的,直接從回收站mv
到hive
對應目錄即可。
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
修改列名time
為times
,並且使用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');
關注公眾號:Java大資料與資料倉儲,領取資料,學習大資料技術。