數倉工具—Hive表的基本操作(3)
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
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
叢集是開啟回收站功能的,刪除外表表的資料就在回收站,後面如果想恢復也是可以恢復的,直接從回收站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');
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